Wie kann ich Dozer sagen, dass die Zuordnung von Null- oder Leerstring-Werten pro Feld mithilfe der Programmier-API umgangen werden soll?

Die FAQ erklärt, wie man das in XML macht. Dies zeigt, wie es pro class mithilfe der API funktioniert. Das Problem ist, dass Sie es in der class aktivieren müssen. Was, wenn ich es nur auf einem Feld haben möchte? Ist das möglich?

    Ich konnte erreichen, was ich benötigte, indem ich meine eigenen benutzerdefinierten Konverter dafür herstellte. Hier ist der Code:

    import org.apache.commons.lang.StringUtils; import org.dozer.DozerConverter; public class IfNotBlankConverter extends DozerConverter { public IfNotBlankConverter() { super(String.class, String.class); } private String getObject(String source, String destination) { if (StringUtils.isNotBlank(source)) { return source; } else { return destination; } } @Override public String convertTo(String source, String destination) { return getObject(source, destination); } @Override public String convertFrom(String source, String destination) { return getObject(source, destination); } } 

    Das Zweite:

     import org.dozer.DozerConverter; public class IfNotNullConverter extends DozerConverter { public IfNotNullConverter() { super(Object.class, Object.class); } @Override public Object convertTo(Object source, Object destination) { return getObject(source, destination); } @Override public Object convertFrom(Object source, Object destination) { return getObject(source, destination); } private Object getObject(Object source, Object destination) { if (source != null) { return source; } else { return destination; } } } 

    Sie brauchen keinen Konverter. Dozer ermöglicht es einfach:

     import static org.dozer.loader.api.TypeMappingOptions.mapNull; import static org.dozer.loader.api.TypeMappingOptions.mapEmptyString; ... public Mapper getMapper() { DozerBeanMapper mapper = new DozerBeanMapper(); mapper.addMapping(beanMappingBuilder()); return mapper; } private BeanMappingBuilder beanMappingBuilder() { return new BeanMappingBuilder() { @Override protected void configure() { mapping(ClassA.class, ClassB.class, mapNull(false), mapEmptyString(false)); } } } 

    Für zukünftige Leser: Die Lösung mit dem Custom Converter hat bei mir nicht funktioniert. Es scheint, dass die Konverter während des Mappings ignoriert werden.

    Die Definition des benutzerdefinierten Feld-Mappers funktionierte jedoch ziemlich gut: (geschrieben in Java 8)

     dozerBeanMapper.setCustomFieldMapper((source, destination, sourceFieldValue, classMap, fieldMapping) -> sourceFieldValue == null); 

    Dieser Mapper gibt einen booleschen Wert zurück, der anzeigt, dass das Mapping für dieses Feld durchgeführt wurde. Wenn also true zurückgegeben wird, wenn das Objekt null ist, benachrichtigt Dozer, dass das Mapping abgeschlossen wurde. Durch das Senden von false wird die Standardzuordnung fortgesetzt. (Siehe MappingProcessor.java – mapField-Methode)