Пользовательский десериализатор Jackon никогда не звонил

Это атрибут, по которому я использовал @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,gajendranc@azuga.com - 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]':

Пожалуйста помоги........

2 ответа

Зарегистрировали ли вы модуль, как указано в этом примере 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

Попробуйте десериализовать только "Set" -> extends JsonDeserializer

Другие вопросы по тегам