You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot+Java11项目中EasyRandom无法创建XMLGregorianCalendar对象求助

解决EasyRandom无法生成XMLGregorianCalendar类型属性的问题

问题场景

项目基于Spring Boot + Java 11开发,单元测试使用EasyRandom生成测试对象时,Card类中的XMLGregorianCalendar类型date属性初始化失败,报错如下:

Caused by: org.jeasy.random.ObjectCreationException: Unable to create type: javax.xml.datatype.XMLGregorianCalendar for field: date of class: com.Card
    at org.jeasy.random.FieldPopulator.populateField(FieldPopulator.java:90)
    at org.jeasy.random.EasyRandom.populateField(EasyRandom.java:206)
    at org.jeasy.random.EasyRandom.populateFields(EasyRandom.java:195)
    at org.jeasy.random.EasyRandom.doPopulateBean(EasyRandom.java:162)

相关代码:

Card类

@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Card", propOrder = {
"name",
"date",
"adress"
})
public class Card{

protected String name;

@XmlSchemaType(name = "date")
protected XMLGregorianCalendar date;

protected String adress;
}

测试类

public class CardTest {

static EasyRandom easyRandom=new EasyRandom();

@Test
void  cardTest(){
Card card= easyRandom.nextObject(Card.class);
//other code
}
}

解决方法

方法1:自定义全局类型生成器

XMLGregorianCalendar是接口,EasyRandom无法直接实例化,需要自定义随机生成器并配置到EasyRandom中:

  1. 编写XMLGregorianCalendar的随机生成器
import org.jeasy.random.api.Randomizer;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.GregorianCalendar;
import java.util.Random;

public class XMLGregorianCalendarRandomizer implements Randomizer<XMLGregorianCalendar> {

    private final Random random = new Random();

    @Override
    public XMLGregorianCalendar getRandomValue() {
        try {
            GregorianCalendar gregorianCalendar = new GregorianCalendar();
            // 随机生成近5年到未来5年的日期,可按需调整范围
            gregorianCalendar.add(GregorianCalendar.YEAR, random.nextInt(10) - 5);
            return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
        } catch (DatatypeConfigurationException e) {
            throw new RuntimeException("Failed to create XMLGregorianCalendar instance", e);
        }
    }
}
  1. 在测试类中配置EasyRandom
import org.jeasy.random.EasyRandom;
import org.jeasy.random.EasyRandomParameters;
import org.junit.jupiter.api.Test;
import javax.xml.datatype.XMLGregorianCalendar;

public class CardTest {

    static EasyRandom easyRandom;

    static {
        EasyRandomParameters parameters = new EasyRandomParameters();
        // 为XMLGregorianCalendar类型绑定自定义生成器
        parameters.randomizer(XMLGregorianCalendar.class, new XMLGregorianCalendarRandomizer());
        easyRandom = new EasyRandom(parameters);
    }

    @Test
    void cardTest() {
        Card card = easyRandom.nextObject(Card.class);
        // 后续测试逻辑
    }
}

方法2:使用注解指定字段生成器

如果不想全局配置,可通过EasyRandom的注解为单个字段指定生成器:

  1. 确保引入easy-random-annotations依赖(Maven示例)
<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-random-annotations</artifactId>
    <version>4.3.0</version>
    <scope>test</scope>
</dependency>
  1. 在Card类的date字段上添加@Randomizer注解
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Card", propOrder = {
    "name",
    "date",
    "adress"
})
public class Card{

    protected String name;

    @XmlSchemaType(name = "date")
    @org.jeasy.random.annotation.Randomizer(XMLGregorianCalendarRandomizer.class)
    protected XMLGregorianCalendar date;

    protected String adress;
}

此时测试类无需修改,直接使用默认EasyRandom实例即可。

方法3:临时替换字段类型(快速测试用)

如果测试场景对类型要求不严格,可以在测试时将XMLGregorianCalendar替换为LocalDate或Date,测试后再转换为目标类型。但这种方法仅适合临时快速验证,不推荐长期使用。

内容的提问来源于stack exchange,提问作者paymer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:33:18