2017-08-10 23 views
0

這是我所使用的@JsonDeserialize定製解串器從來沒有所謂

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

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

而定製的解串器代碼的屬性是

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

但解串器永遠不會被調用。請幫助

每次我得到這個異常,而不是....

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]': 

請幫助........

+0

爲什麼@Transient?你想在序列化過程中忽略該字段? – Barath

+0

@Barath:瞬態是爲了讓hibernate忽略這個字段,同時堅持表...這與序列化無關。 – Sabya

+0

感謝您的教育。因爲我無法找到任何暫時的import語句,我認爲它必須使用java序列化來完成某些操作。 – Barath

回答

0

嘗試反序列化唯一的 「設置」 - >擴展JsonDeserializer <集>

+0

沒有工作..同樣的例外。 – Sabya

+0

想象出使用RequestPart註釋時不會調用反序列化器。但是,當使用RequestBody註釋時,它會被調用。不知道爲什麼? – Sabya

+0

** RequestBody **表示可以通過HttpMessageConverter轉換請求的正文,以按類型解析內容。 (將內容(xml/json/...等)轉換爲對象) ** RequestPart **它用於多部分表單數據 - 主要用於文件上載。 –

0

您是否註冊了本示例中提到的模塊http://www.baeldung.com/jackson-deserialization

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

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

這是爲我工作:

@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>>() { 
    }); 

} 

型號:

public class TestUser { 

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

public class UserVehicleMappingVO { 

    private String name; 

//getters and setters 

} 

自定義解串器類:

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

響應:

Output {"vechicles":[{"name":"test1"}]} 
hello 

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

參考這裏:https://dzone.com/articles/customizing

+0

對我來說,json來自UI,所以在哪裏註冊解串器? – Sabya

+0

自定義httpmessageconverter,查看更新的答案 – Barath

相關問題