Шифровать поля пользовательских объектов при сериализации сервисов JSON Rest - PullRequest
0 голосов
/ 22 февраля 2019

Уважаемые,

Я застрял здесь:

С Spring 4.3.3.RELEASE пытается зашифровать одно поле объекта Amount (Custom Object) с помощью JsonSerializer из objectMapper

Я установил это

@Override
public void configureMessageConverters(
    List<HttpMessageConverter<?>> converters) {
    //Added string converter to avoid scape " and the addition of " at the beginning of the Json
    converters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
    converters.add(new MappingJackson2HttpMessageConverter(objectMapper));

}

В этом классе определен объект-сопоставитель

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.registerModule(new JodaMoneyModule());
    objectMapper.registerModule(new JodaModule());
    //objectMapper.registerModule(new AmountModule());
    objectMapper.getFactory().setCharacterEscapes(new JavascriptCharacterEscapes());
    return objectMapper;

}

Где AmountModule - мой пользовательский сериализатор

public class AmountModule extends SimpleModule
{
    private static final long serialVersionUID = 1L;

    public AmountModule()
    {
        super();

        // then serializers:
        addSerializer(Amount.class, new AmountSerializer());

    }
}

public class AmountSerializer extends JsonSerializer<Amount> {

    @Override
    public void serialize(Amount amount, JsonGenerator jgen, SerializerProvider provider) throws IOException,  JsonProcessingException {
        if (amount!=null) {
            try {
                amount.setValue(webParamEncryptor.encryptWebParam(amount.getValue().toPlainString()));
                jgen.writeObject(amount);
            } catch (Exception e) {
                logger.error("Error to marshal date", e);
            }
        } else {
            jgen.writeNull();
        }

    }
}

И мой объектСумма указана ниже:

 public class Amount extends Currency {
    private static final long serialVersionUID = 1L;

    @JsonProperty("value")
    private String value = null;

    @JsonProperty("customDisplay")
    private String customDisplay = null;

    private boolean roundToCurrencyDecimals= true;

Использование объекта Баланс Сумма

public class Account implements Serializable {
private static final long serialVersionUID = 1L;

@JsonProperty("id")
private int id;

@JsonIgnore
private String number = null;

@JsonIgnore
private Amount balance = null;

При сериализации Учетной записи появляется следующая ошибка:

Невозможно записать содержимое: Бесконечная рекурсия (StackOverflowError) (через цепочку ссылок: java.util.ArrayList [0] -> accounts.domain.Account [\ "balance \"]);

Я все перепробовал @JsonIgnore /@JsonView / @JsonManagedReference, @JsonBackReference} и @JsonIdentityInfo / @JsonIdentityInfo, и мне кажется, что ничего не работает, или, может быть, я устанавливаю вещи в неправильном месте.

Может ли кто-нибудь мне помочь?Спасибо

...