मेरे पास मेरे "कमांड" में कुछ सत्यापन हैं, नियंत्रक के पैरामीटर जो प्रत्येक विशेषता के सेट के भीतर निष्पादित होते हैं, समस्या यह है कि विशेषताओं को सूचित नहीं किया जाता है, जैक्सन सत्यापन करने के लिए सेट विधि का आह्वान नहीं करता है। क्या विशेषता गायब होने पर भी जैक्सन को सेट विधि का आह्वान करने के लिए मजबूर करना संभव है?
उदाहरण के लिए एजेंसी फ़ील्ड के बिना पेलोड:
{
"bank": "237",
"account": "20772-1",
"taxId": "36456155800",
"paidAmount": 30.00
}
मेरा नियंत्रक:
public Return confirmTransfer(@RequestBody RechargeTransferConfirmationCommand command) {
System.out.println(command);
}
कक्षा जावा:
public class RechargeTransferConfirmationCommand {
public static final String ERR_INVALID_AGENCY = "Agency number can not be null.";
private String bank;
private String account;
private String agency;
private String taxId;
public RechargeTransferConfirmationCommand(BigDecimal paidAmount, String bank, String account,
String agency, String taxId) {
setPaidAmount(paidAmount);
setBank(bank);
setAccount(account);
setAgency(agency);
setTaxId(taxId);
}
public void setRechargeId(RechargeId rechargeId) {
assertArgumentNotNull(rechargeId, Recharge.ERR_RECHARGE_ID_INVALID);
this.rechargeId = rechargeId;
}
private void setPaidAmount(BigDecimal paidAmount) {
if (paidAmount == null || paidAmount.compareTo(BigDecimal.ZERO) < 0)
throw new IllegalArgumentException(Recharge.ERR_INVALID_AMOUNT);
this.paidAmount = paidAmount;
}
private void setBank(String bank) {
assertArgumentNotEmpty(bank, TransferInformation.ERR_INVALID_BANK_NUMBER);
this.bank = bank;
}
private void setAccount(String account) {
assertArgumentNotEmpty(account, TransferInformation.ERR_INVALID_ACCOUNT);
this.account = account;
}
private void setAgency(String agency) {
assertArgumentNotEmpty(agency, ERR_INVALID_AGENCY);
this.agency = agency;
}
private void setTaxId(String taxId) {
assertArgumentNotEmpty(taxId, ERR_INVALID_TAX_ID);
this.taxId = taxId;
}
}
इस मामले में, प्रत्येक फ़ील्ड के लिए सत्यापन करने के लिए सेट विधि को लागू किया जाता है, एजेंसी फ़ील्ड को छोड़कर जिसे पेलोड में सूचित नहीं किया गया था, इसे जल्द ही विधि assertArgumentNotEmpty में निहित अपवाद को फेंक देना चाहिए।
3 जवाब
हाँ जैक्सन उन क्षेत्रों के setter
तरीकों को लागू नहीं करेगा जो पेलोड में पारित नहीं हुए हैं, यदि आप लापता फ़ील्ड को मान्य करना चाहते हैं तो आपको कस्टम Deserializer
की आवश्यकता है
class RechargeTransferConfirmationCommandDeserializer extends JsonDeserializer<RechargeTransferConfirmationCommand> {
@Override
public RechargeTransferConfirmationCommand deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
RechargeTransferConfirmationCommand responseModel = jp.readValueAs(RechargeTransferConfirmationCommand.class);
RechargeTransferConfirmationCommand finalModel = new RechargeTransferConfirmationCommand();
finalModel.set agency(responseModel. agency == null || age.trim().isEmpty() ? "agency" : responseModel.agency);
return finalModel;
}
}
और आप मॉडल होना चाहिए
@JsonDeserialize(using = DefaultModelDeserializer.class)
public class DefaultModel {
...
}
@JsonSetter
का उपयोग विधि में && घोषित no args constructor
भी करें:
public RechargeTransferConfirmationCommand(){
}
@JsonSetter
public void setRechargeId(RechargeId rechargeId) {
assertArgumentNotNull(rechargeId, Recharge.ERR_RECHARGE_ID_INVALID);
this.rechargeId = rechargeId;
}
लेकिन बेहतर है कि आप जावैक्स सत्यापन का उपयोग करें। विवरण प्राप्त करने के लिए यह देखें।
दूसरा तरीका: आप सभी सत्यापन को एक विधि में लिख सकते हैं और @AssertTrue का उपयोग कर सकते हैं:
@AssertTrue
public boolean isValid(){
//if all field is valid then return true;
return false;
}
@JsonCreator का उपयोग करके हल की गई समस्या, आपकी मदद के लिए आप सभी का धन्यवाद
@JsonCreator
public RechargeTransferConfirmationCommand(@JsonProperty("paidAmount") BigDecimal paidAmount,
@JsonProperty("bank") String bank, @JsonProperty("account") String account,
@JsonProperty("agency") String agency, @JsonProperty("taxId") String taxId) {
setPaidAmount(paidAmount);
setBank(bank);
setAccount(account);
setAgency(agency);
setTaxId(taxId);
}
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।
@NotNull
और@Min
एनोटेशन का उपयोग क्यों न करें?