2011-03-08 2 views
2

Dozer를 사용하여 기본 클래스에서 서로 자동으로 매핑하려고합니다. 결국 코드는 결국 이렇게 될 수 있습니다. 빈에서, 직접적 Boolean 매핑을 보인다 다음과 같은 예외를 생성 할 때 도저가 Boolean에 지원 매핑 String을 수행하는 동안Dozer를 사용하여 원시 클래스 (문자열, 부울 등)를 서로 매핑합니다.

Boolean resultBoolean = mapper.map("true", Boolean.class); 

.

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 

Dozer가 부울을 인스턴스화하려고 시도하는 것은 분명합니다. 부울을 String으로 변환하는 고객 DozerConverter을 만들 수 있지만 Dozer가 이미 가지고있는 코드를 다시 구현하고 싶지는 않습니다. Dozer가 기본 유형과 직접 맵핑하도록 할 수있는 방법이 있습니까?

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); 
    } 
} 

또는 사용자 정의 변환에 모두 마무리 :

답변

0

당신은 org.dozer.converters.PrimitiveOrWrapperConverter 대신 org.dozer.DozerBeanMapper 사용할 수

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; 
    } 

} 

그리고이 예제 구성 파일 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> 

사용자 지정 변환기를 사용하여 매핑을 실행하는 예제 클래스입니다.

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); 

    } 
} 
관련 문제