简体   繁体   English

使用推土机将基本类(字符串,布尔值等)相互映射

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM