2009-05-13 12 views

Respuesta

3

No estoy del todo seguro de lo que quiere decir, si quiere que Dozer siempre llene BeanB.someField con una constante cada vez que traduzca de BeanA a BeanB.

Es posible que desee registrar un custom converter para esta asignación.

+0

Sí, eso es exactamente lo que quiero. Me preguntaba si era posible hacerlo directamente sin un convertidor personalizado. –

+0

Gracias por la respuesta, por cierto. –

+0

Creo que sus únicos métodos son usar una conversión personalizada o hacerlo manualmente cuando invoque a Dozer. Dozer solo realmente maneja el mapeo de un bean a otro, y no le da mucho espacio para insertar otra lógica (lo cual tiene sentido, ya que no está destinado a hacer eso). –

2

¿Qué le parece aprovechar el mecanismo de eventos?

Para que pueda registrar un oyente que haría la configuración del valor en mappingFinished() de su oyente. Consultar dozer doc on events para más detalles. Por supuesto, tendría que guardar el código de configuración con algún tipo de condición if ... instanceof.

+0

Esto funcionó muy bien para mí, aunque puse mi gancho en 'preWritingDestinationValue', por lo que los valores actúan como predeterminados, en lugar de anular lo que ya se ha mapeado. – tzrlk

1

Las compilaciones recientes de dozer lo hacen más fácil. Puede especificar ambos convertidores personalizados y puede especificar parámetros para ese convertidor para un mapeo de campo dado. Sería trivial crear un único 'ConstantConverter' que tomará un parámetro de entrada y lo colocará en el campo de salida el 100% del tiempo.

+1

En realidad, no es tan fácil con convertidores personalizados. Necesitarías escribir un convertidor para toda la clase que contiene el campo (lo que frustra el propósito de usar dozer en primer lugar) o andar con feas soluciones para unir un convertidor a un solo campo (y ese campo solo existe en un campo). de las clases). Sin embargo, podría ser un buen enfoque en algunos casos (dependiendo de cómo estén estructurados sus objetos). – Lajcik

0

Esto es bastante simple con ModelMapper:

ModelMapper modelMapper = new ModelMapper(); 

modelMapper.addMappings(new PropertyMap<SourceClass, DestClass>() { 
    protected void configure() { 
    map().setSomeProperty(someConstant); 
    } 
}); 

Este ejemplo se asigna someConstant-DestClass.someProperty.

Se puede extraer más ejemplos y documentos en: http://modelmapper.org

0

Una posible implementación es:

public class ConstantsCustomConvertor implements ConfigurableCustomConverter{ 

    private String pararamter; 
    @Override 
    public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass, Class<?> sourceClass) {  
     return pararamter; 
    } 

    @Override 
    public void setParameter(String parameter) { 
     this.pararamter = parameter; 

    } 
} 

Ejemplo:

<field custom-converter-param="CONTANT_VALUE" custom-converter="org.yourcompany.ConstantsCustomConvertor"> 
    <a>a-class-dummyfieldname</a> 
    <b>b-class-fieldname</b> 
</field>  

Este convertidor personalizado es supone que la clase b -fieldname es de tipo String.