2017-04-19 1 views
0

Ich habe eine User und UserDTO Klasse, aber in dto Klasse möchte ich LocalDateTime nicht verwenden, ich möchte es in Long-Typ konvertieren. (weil Protobuf nicht unterstützt Datum). So in Code:Wie wird mit Dozer ein Datentyp auf einen anderen Datentyp abgebildet?

Mein Benutzer Entitätsklasse:

public class User { 
    private String name,password; 
    private LocalDateTime date; 
//getters-setters, tostring.. 
} 

Mein DTO:

public class UserDTO { 
    private String name,password; 
    private long date; 
//getters-setters, tostring.. 
} 

Und sehen Sie, dass das Datum in Unternehmen Mitglied ist Local und in DTO ist lang. Ich mag diesen dozermapper verwenden:

UserDTO destObject = 
      mapper.map(user, UserDTO.class); 

Der Localwechselcode zu lang:

private static long setDateToLong(LocalDateTime date) {   
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 
    String dateString = date.format(formatter); 
    return Long.parseLong(dateString);   
} 

Ist es möglich, dass der Mapper weiß, dass die Local zu lange ändern? Kann ich es irgendwie konfigurieren? Danke für die Hilfe!

Antwort

0

Schließlich habe ich eine Lösung gefunden, die von LocalDateTime zu String und zurück von String zu LocalDateTime erstellt wird. Ich muss einen Konverter erstellen:

public class DozerConverter implements CustomConverter { 
    @Override 
    public Object convert(Object destination, Object source, Class destClass, Class sourceClass) { 
     DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; 
     if(source instanceof String) { 
      String sourceTime = (String) source; 
      return LocalDateTime.parse(sourceTime, formatter); 
     } else if (source instanceof LocalDateTime) { 
      LocalDateTime sourceTime = (LocalDateTime) source; 
      return sourceTime.toString(); 
     } 
     return null; 
    } 

}

Und in meiner benutzerdefinierten xml ich habe die benutzerdefinierte-Konverter Attribut wie diese hinzuzufügen: es kann

<?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"> 
    <mapping> 
     <class-a>mypackage.UserDTO</class-a> 
     <class-b>mypackage.User</class-b> 
     <field custom-converter="mypackage.DozerConverter"> 
      <a>lastLoggedInTime</a> 
      <b>lastLoggedInTime</b> 
     </field> 
    </mapping> 
</mappings> 

Ich denke, die Arbeit mit irgendwelche Datentypen, muss einfach mehr Konverter schreiben, oder schreibe diesen Konverter smart.