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中:
- 编写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); } } }
- 在测试类中配置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的注解为单个字段指定生成器:
- 确保引入easy-random-annotations依赖(Maven示例)
<dependency> <groupId>org.jeasy</groupId> <artifactId>easy-random-annotations</artifactId> <version>4.3.0</version> <scope>test</scope> </dependency>
- 在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
相关产品推荐
相关产品推荐

