मेरे पास मेरे "कमांड" में कुछ सत्यापन हैं, नियंत्रक के पैरामीटर जो प्रत्येक विशेषता के सेट के भीतर निष्पादित होते हैं, समस्या यह है कि विशेषताओं को सूचित नहीं किया जाता है, जैक्सन सत्यापन करने के लिए सेट विधि का आह्वान नहीं करता है। क्या विशेषता गायब होने पर भी जैक्सन को सेट विधि का आह्वान करने के लिए मजबूर करना संभव है?

उदाहरण के लिए एजेंसी फ़ील्ड के बिना पेलोड:

{
   "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 में निहित अपवाद को फेंक देना चाहिए।

2
Tiago Costa 8 अगस्त 2018, 05:36
1
सत्यापन से निपटने के लिए @NotNull और @Min एनोटेशन का उपयोग क्यों न करें?
 – 
Rishikesh Dhokare
8 अगस्त 2018, 05:40
चूंकि इस एनोटेशन का उपयोग क्लाइंट के लिए रिटर्न ऑब्जेक्ट ढांचे के लिए विशिष्ट है, इसलिए मुझे कस्टम रिटर्न की आवश्यकता है। यह मेरा अपवाद है जिसे मैं @ControllerAdvice क्लास में कैप्चर कर सकता हूं और एक मित्रवत प्रतिक्रिया लौटा सकता हूं।
 – 
Tiago Costa
8 अगस्त 2018, 05:43
यदि आपका जावैक्स सत्यापन विफल हो गया है तो आप @ControllerAdvice को इंटरसेप्ट कर सकते हैं। यहां तक ​​​​कि जावैक्स सत्यापन में भी आप उस संदेश का उपयोग कर सकते हैं जहां पास सत्यापन विफल संदेश है
 – 
GolamMazid Sajib
8 अगस्त 2018, 06:48

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 {

...
}
1
Deadpool 8 अगस्त 2018, 05:48

@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;
}
0
GolamMazid Sajib 8 अगस्त 2018, 06:34

@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);
}
0
Tiago Costa 8 अगस्त 2018, 16:41