#java #json #spring-boot #jackson #gson
#java #json #весенняя загрузка #джексон #gson
Вопрос:
Я использую следующую полезную нагрузку запроса:
{
"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 поступал в любом порядке, он делал то же самое.
Я использую spring boot и com.fasterxml.jackson.annotation
.
Ответ №1:
Если я понимаю вашу проблему, вам необходимо выполнить некоторую обработку ваших свойств при создании экземпляра 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;
}
Комментарии:
1. я использовал
@JsonPropertyOrder({ "accountId", "name", "email", "phone", "frequency", "paymentMethod" })
, но все еще получаю ту же проблему. Есть ли какие-либо другие аннотации, которые можно использовать для упорядочения?2. Когда я использовал
@JsonPropertyOrder
и отлаживалsetPaymentMethod
, тогдаthis.sevaluation
естьnull
, но я передаю значениеsevaluation
beforepaymentMethod
.3. @ankit Вы могли бы попробовать
@JsonCreator
вместо этого. Позвольте мне соответствующим образом обновить свой ответ.