[英]Mapping primitive classes (String, Boolean, etc) to each other with Dozer
I'm trying to use Dozer to automatically map from primitive classes to each other. 我正在尝试使用推土机自动从原始类相互映射。 At the end, the code might end up looking like this.
最后,代码可能最终看起来像这样。
Boolean resultBoolean = mapper.map("true", Boolean.class);
While Dozer does support mapping String
to Boolean
when in a bean, it seems mapping directly to Boolean
produces the following exception. 当在Dozer中,Dozer确实支持将
String
映射为Boolean
时,似乎直接映射为Boolean
会产生以下异常。
org.dozer.MappingException: java.lang.NoSuchMethodException: java.lang.Boolean.<init>()
at org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:88)
at org.dozer.factory.ConstructionStrategies$ByConstructor.newInstance(ConstructionStrategies.java:261)
at org.dozer.factory.ConstructionStrategies$ByConstructor.create(ConstructionStrategies.java:245)
at org.dozer.factory.DestBeanCreator.create(DestBeanCreator.java:65)
at org.dozer.MappingProcessor.map(MappingProcessor.java:178)
at org.dozer.MappingProcessor.map(MappingProcessor.java:125)
at org.dozer.MappingProcessor.map(MappingProcessor.java:120)
at org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:111)
...
Caused by: java.lang.NoSuchMethodException: java.lang.Boolean.<init>()
at java.lang.Class.getConstructor0(Class.java:2706)
at java.lang.Class.getDeclaredConstructor(Class.java:1985)
at org.dozer.factory.ConstructionStrategies$ByConstructor.newInstance(ConstructionStrategies.java:257)
... 32 more
It is clear that Dozer is trying to instantiate the Boolean itself. 很明显,Dozer正在尝试实例化布尔值本身。 I'm able to create a customer
DozerConverter
to convert Boolean to String, but I don't want to re-implement the code that Dozer already has. 我能够创建一个客户
DozerConverter
来将Boolean转换为String,但是我不想重新实现Dozer已经拥有的代码。 Is there any way to get Dozer to map to and from primitive types directly? 有什么方法可以使Dozer直接在原始类型之间进行映射?
You could use org.dozer.converters.PrimitiveOrWrapperConverter
instead of org.dozer.DozerBeanMapper
: 您可以使用
org.dozer.converters.PrimitiveOrWrapperConverter
而不是org.dozer.DozerBeanMapper
:
import org.dozer.converters.DateFormatContainer;
import org.dozer.converters.PrimitiveOrWrapperConverter;
public class DozerPrimitiveMapping {
public static void main(String[] args) {
PrimitiveOrWrapperConverter primitiveConverter = new PrimitiveOrWrapperConverter();
//DateFormatContainer is not needed in this String-to-Boolean use case, but the converter would throw an error if it was null
DateFormatContainer dateFormatContainer = new DateFormatContainer("");
Boolean booleanResult= (Boolean) primitiveConverter.convert("true", Boolean.class, dateFormatContainer);
System.out.println("Boolean result from dozer: "+booleanResult);
}
}
Or wrap it all up in a custom converter: 或将其全部包装在自定义转换器中:
package my.dozer.test;
import org.dozer.CustomConverter;
import org.dozer.converters.DateFormatContainer;
import org.dozer.converters.PrimitiveOrWrapperConverter;
public class DozerPrimitiveConverter implements CustomConverter {
private final PrimitiveOrWrapperConverter primitiveConverter = new PrimitiveOrWrapperConverter();
//DateFormatContainer is not needed in this String-to-Boolean use case, but the converter would throw an error if it was null
private final DateFormatContainer dateFormatContainer = new DateFormatContainer("");
@Override
public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass, Class<?> sourceClass) {
Boolean booleanResult = (Boolean) primitiveConverter.convert(sourceFieldValue, Boolean.class, dateFormatContainer);
return booleanResult;
}
}
And configure the converter like it is in this example configuration file dozer-primitive-mapping.xml
: 并像在此示例配置文件
dozer-primitive-mapping.xml
一样配置转换器:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<configuration>
<custom-converters>
<converter type="my.dozer.test.DozerPrimitiveConverter" >
<class-a>java.lang.String</class-a>
<class-b>java.lang.Boolean</class-b>
</converter>
</custom-converters>
</configuration>
</mappings>
Example class to run the mapping with using the custom converter: 使用自定义转换器运行映射的示例类:
package my.dozer.test;
import java.io.InputStream;
import org.dozer.DozerBeanMapper;
public class DozerPrimitiveConverterApp {
public static void main(String[] args) {
DozerBeanMapper mapper = new DozerBeanMapper();
InputStream is = DozerPrimitiveConverterApp.class.getClassLoader().getResourceAsStream("dozer-primitive-mapping.xml");
mapper.addMapping(is);
Boolean booleanValue = mapper.map("false", Boolean.class);
System.out.println("Boolean result from dozer with custom converter: " + booleanValue);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.