2016-09-21 2 views
3

Есть ли простой способ применить настраиваемое логическое преобразование к значению конкретного ключа во время десериализации бобов?Применить простую строку к преобразованию строки во время десериализации

Конкретный пример, я получаю следующий JSON:

{password: "1234"} 

и хочу специальную хэш-функцию, приложенную к значению пароля при десериализации:

User [password: "6265b22b66502d70d5f004f08238ac3c"] 

Я знаю, что я мог бы использовать сеттер User.setPassword() и примените здесь хэш-преобразование, но для преобразования необходимо использовать классы «Сервис», которые недоступны в контексте объекта (плохое использование инъекции зависимостей). Это преобразование должно быть сделано вне кода сущности.

Использование настраиваемого десериализатора для класса User, похоже, слишком велико для одного атрибута.

+0

Вы можете использовать аннотацию * @ JsonSerialize * и * @ JsonDeserialize * для установки определенного класса, реализующего определенный интерфейс. Таким образом, вы можете поместить всю сериализацию/десериализацию в эти классы. –

+0

@JsonDeserialize выглядит многообещающим, но пока не могу понять, как его использовать. я посмотрю более подробно. –

ответ

2

Используйте аннотацию, чтобы определить пользовательский сериализатор/десериализатор для обработки компонента.

Вот пример боба где вы определяете ваши пользовательские классы сериализатору/десериализации:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 
import com.fasterxml.jackson.databind.annotation.JsonSerialize; 

public class User { 

    @JacksonXmlProperty 
    private String login; 

    @JacksonXmlProperty 
    @JsonSerialize(using=your.class.package.PasswordSerializer.class) 
    @JsonDeserialize(using=your.class.package.PasswordDeserializer.class) 
    private String password; 
    // ... 
} 

А вот Custo, сериализатору пример:

import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.SerializerProvider; 
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator; 

import java.io.IOException; 

public class PasswordSerializer extends JsonSerializer<String> { 
    @Override 
    public void serialize(String s, JsonGenerator jg, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { 

     // do your staff here. 

    } 
} 

Вам просто нужно реализовать интерфейс , и вы можете сделать это в правильной упаковке.

Deserializer похож.

+0

Спасибо, ваш ответ заставил меня по пути. Но мне нужно решить другой вопрос. Я нахожусь в контексте Spring и нуждаюсь в том, чтобы вводить службы в класс Deserializer. –

+0

@tiben Это не проблема весной, вы можете реализовать интерфейсы в компоненте Spring и вставить компоненты/компоненты, которые вам нужны. –

+0

Juste сделал тест и не может использовать '@ Autowired' в классе MyDeserializer. Несмотря на использование @Component, оно приводит к исключению NullPointException, потому что при использовании с @JsonDeserialize (с использованием = MyDeserializer.class) я предполагаю, что «новый» экземпляр моего Deserializer запускается вне механизма пружины зависимостей весны. Но переделайте, я думаю, что это еще один вопрос, поэтому я принимаю ваш ответ, потому что он решает большую часть моей проблемы. –