Как заказать Json при десериализации с использованием аннотации? - PullRequest
0 голосов
/ 15 апреля 2019

Я использую следующий запрос:

{
    "accountId": "8b7d80bd-120e-4059-9802-a8af9ac04038",
    "name": "Client sucqtixp",
    "email": "Niles@qa4life.com",
    "phone": "1234567890",
    "frequency": "MONTHLY"
    "paymentMethod": {
        "id": "00eef328-bd2c-4ccb-8b8e-12bd0c2552ad",
        "type": "BANK_ACCOUNT"
    }
}

Я использую @RequestBody:

@Data
@JsonInclude( JsonInclude.Include.NON_NULL )
public class AccountVO
{
    private UUID accountId;

    private String name;

    private String email;

    private String phone;

    private String frequency;

    private PaymentMethodVO paymentMethod;

    public void setPaymentMethod( PaymentMethodVO paymentMethod )
    {
        paymentMethod.setSevaluation( paymentMethod.getSevaluation() == null ? Frequency.valueOf( this.sevaluation ) : paymentMethod.getSevaluation() );
        this.paymentMethod = paymentMethod;
    }
}

Я пытаюсь установить частоту счета на частоту paymentMethod, если она не указана, но когда в json-запросе frequency отправлять после paymentMethod, тогда значение null входит в частоту paymentMethod.

Я хочу, чтобы запрос json приходил в любом порядке, он делал бы то же самое.

Я использую пружинный ботинок и com.fasterxml.jackson.annotation.

1 Ответ

1 голос
/ 15 апреля 2019

Если я понимаю вашу проблему, вам нужно выполнить некоторую обработку ваших свойств при создании экземпляра AccountVO.

, чтобы вы могли использовать @JsonCreator в конструкторе:

@Data
@JsonInclude(Include.NON_NULL)
public class AccountVO {

    // Fields omitted

    public AccountVO(@JsonProperty("accountId") String accountId,
                     @JsonProperty("name") String name,
                     @JsonProperty("email") String email,
                     @JsonProperty("phone") String phone,
                     @JsonProperty("frequency") String frequency,
                     @JsonProperty("paymentMethod") PaymentMethodVO paymentMethod) {

        this.accountId = accountId;
        this.name = name;
        this.email = email;
        this.phone = phone;
        this.frequency = frequency;
        this.paymentMethod = paymentMethod; // Do any other processing here
    }
}

В качестве альтернативы вы можете использовать @JsonCreator в заводском методе:

@Data
@JsonInclude(Include.NON_NULL)
public class AccountVO {

    // Fields omitted

    @JsonCreator
    public static AccountVO factory(
                     @JsonProperty("accountId") String accountId,
                     @JsonProperty("name") String name,
                     @JsonProperty("email") String email,
                     @JsonProperty("phone") String phone,
                     @JsonProperty("frequency") String frequency,
                     @JsonProperty("paymentMethod") PaymentMethodVO paymentMethod) {

        AccountVO account = new AccountVO();
        account.setAccountId(accountId);
        account.setName(name);
        account.setEmail(email);
        account.setPhone(phone);
        account.setFrequency(frequency);
        account.setPaymentMethod(paymentMethod); // Do any other processing here
        return account;
    }
...