2017-08-10 5 views
0
genannt

Dies ist das Attribut, auf das ich die @JsonDeserialize verwendet habeJackon benutzerdefinierter Deserializer nie

@Transient 
@JsonDeserialize(using = SharedUserDeserializer.class) 
private Set<UserVehicleMappingVO> sharedVehicle; 

public Set<UserVehicleMappingVO> getSharedVehicle() { 
    return sharedVehicle; 
} 
public void setSharedVehicle(Set<UserVehicleMappingVO> sharedVehicle) { 
    this.sharedVehicle = sharedVehicle; 
} 

Und den benutzerdefinierten Deserializer-Code ist

public class SharedUserDeserializer extends JsonDeserializer<Set<UserVehicleMappingVO>> { 

@Override 
public Set<UserVehicleMappingVO> deserialize(JsonParser paramJsonParser, 
     DeserializationContext paramDeserializationContext) 
     throws IOException, JsonProcessingException { 
    try { 
     Set<UserVehicleMappingVO> list = new ObjectMapper().readValue(paramJsonParser.toString(), 
       new TypeReference<Set<UserVehicleMappingVO>>() {}); 
     return list; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return new HashSet<>(); 
} 
} 

Aber die Deserializer nie aufgerufen. Bitte helfen

Jedesmal, wenn ich diese Ausnahme stattdessen bekommen ....

ERROR :::9,[email protected] - Exception in 
method===org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'trackee' on field 'sharedVehicle': rejected value 
[[{"userId":"5d48b74f-7da2-11e7-87bf- 
1383429d1d89","expireTime":1504190100000}]]; codes 
[typeMismatch.trackee.sharedVehicle,typeMismatch.sharedVehicle, 
typeMismatch.java.util.Set,typeMismatch]; arguments 
[org.springframework.context.support.DefaultMessageSourceResolvable: codes 
[trackee.sharedVehicle,sharedVehicle]; arguments []; default message 
[sharedVehicle]]; default message [Failed to convert property value of type 
[java.lang.String] to required type [java.util.Set] for property 
'sharedVehicle'; nested exception is java.lang.IllegalStateException: Cannot 
convert value of type [java.lang.String] to required type 
[com.azuga.user.manager.UserVehicleMappingVO] for property 
'sharedVehicle[0]': 

Bitte helfen ........

+0

warum @Transient? Sie möchten das Feld während des Serialisierungsprozesses ignorieren? – Barath

+0

@Barath: Transient ist für Hibernate, dieses Feld zu ignorieren, während in Tabelle beibehalten wird ... Es hat nichts mit der Serialisierung zu tun. – Sabya

+0

danke für die Ausbildung. Da ich keine Import-Anweisung für transient finden konnte, dachte ich, dass es etwas mit Java-Serialisierung zu tun hat. – Barath

Antwort

0

Try deserialize nur "Set" -> erweitert JsonDeserializer < Set>

+0

hat nicht funktioniert .. gleiche Ausnahme. – Sabya

+0

Ermittelt ... Der Deserializer wird nicht aufgerufen, wenn die Annotation RequestPart verwendet wird. Aber wenn RequestBody Annotation verwendet wird, wird es aufgerufen. Nicht sicher warum? – Sabya

+0

** RequestBody ** bedeutet, dass der Hauptteil der Anfrage von HttpMessageConverter konvertiert werden kann, um den Inhalt nach seinem Typ aufzulösen. (Konvertieren von Inhalt (xml/json/... etc.) in Objekt) ** RequestPart ** es ist für mehrteilige Formulardaten - im Grunde für den Dateiupload. –

0

Haben Sie das Modul wie in diesem Beispiel beschrieben registriert? http://www.baeldung.com/jackson-deserialization?

 ObjectMapper mapper=new ObjectMapper(); 
     SimpleModule module = new SimpleModule(); 

     module.addDeserializer(Set.class, new SharedUserDeserializer()); 
     mapper.registerModule(module); 

Es funktioniert für mich:

@Test 
    public void test() throws IOException { 

     ObjectMapper mapper=new ObjectMapper(); 
     SimpleModule module = new SimpleModule(); 

     module.addDeserializer(Set.class, new SharedUserDeserializer()); 
     mapper.registerModule(module); 
     TestUser user=new TestUser(); 

    Set<UserVehicleMappingVO> sets=new HashSet<>(); 

    sets.add(new UserVehicleMappingVO("test1")); 
    user.setVechicles(sets); 

    String jsonString=mapper.writeValueAsString(user); 
    Set<UserVehicleMappingVO> vechiles=mapper.readValue(jsonString, new TypeReference<Set<UserVehicleMappingVO>>() { 
    }); 

} 

Modell:

public class TestUser { 

    @JsonDeserialize(using = SharedUserDeserializer.class) 
    private Set<UserVehicleMappingVO> vechicles; 
    //getters and setters 
} 

public class UserVehicleMappingVO { 

    private String name; 

//getters and setters 

} 

Individuelle Deserializer Klasse:

public class SharedUserDeserializer extends JsonDeserializer<Set<UserVehicleMappingVO>> { 

@Override 
public Set<UserVehicleMappingVO> deserialize(JsonParser paramJsonParser, 
     DeserializationContext paramDeserializationContext) 
     throws IOException, JsonProcessingException { 
    try { 
     System.out.println("hello"); 
     Set<UserVehicleMappingVO> list = new ObjectMapper().readValue(paramJsonParser.toString(), 
       new TypeReference<Set<UserVehicleMappingVO>>() {}); 
     return list; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return new HashSet<>(); 
} 

Antwort:

Anpassen der HttpMessageConverters:

@Bean 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); 
ObjectMapper objectMapper = new ObjectMapper(); 
SimpleModule module = new SimpleModule(); 

      module.addDeserializer(Set.class, new SharedUserDeserializer()); 
      objectMapper.registerModule(module); 

jsonConverter.setObjectMapper(objectMapper); 
return jsonConverter; 
} 

Referenz hier: https://dzone.com/articles/customizing

+0

Für mich kommt der JSON von der Benutzeroberfläche, also wo den Deserializer registrieren? – Sabya

+0

passen Sie den httpmessageconverter an, sehen Sie die aktualisierte Antwort – Barath

Verwandte Themen