2015-11-10 6 views
10

मैं इस वर्ग के प्रकार enum REOs की संपत्ति में शामिल है इस enumस्प्रिंग @RequestBody और Enum मूल्य

public enum Reos { 

    VALUE1("A"),VALUE2("B"); 

    private String text; 

    Reos(String text){this.text = text;} 

    public String getText(){return this.text;} 

    public static Reos fromText(String text){ 
     for(Reos r : Reos.values()){ 
      if(r.getText().equals(text)){ 
       return r; 
      } 
     } 
     throw new IllegalArgumentException(); 
    } 
} 

और एक वर्ग कहा जाता है की समीक्षा है,।

public class Review implements Serializable{ 

    private Integer id; 
    private Reos reos; 

    public Integer getId() {return id;} 

    public void setId(Integer id) {this.id = id;} 

    public Reos getReos() {return reos;} 

    public void setReos(Reos reos) { 
     this.reos = reos; 
    } 
} 

अंत में मैं एक नियंत्रक कि @RequestBody के साथ एक वस्तु की समीक्षा प्राप्त करता है।

@RestController 
public class ReviewController { 

    @RequestMapping(method = RequestMethod.POST, value = "/reviews") 
    @ResponseStatus(HttpStatus.CREATED) 
    public void saveReview(@RequestBody Review review) { 
     reviewRepository.save(review); 
    } 
} 

मैं साथ

{"reos":"VALUE1"} 

वहाँ समस्या नहीं है, लेकिन जब मैं

{"reos":"A"} 

साथ आह्वान मैं यह त्रुटि

Could not read document: Can not construct instance of com.microservices.Reos from String value 'A': value not one of declared Enum instance names: [VALUE1, VALUE2] at [Source: [email protected]; line: 1, column: 40] (through reference chain: com.microservices.Review["reos"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of com.microservices.Reos from String value 'A': value not one of declared Enum instance names: [VALUE1, VALUE2] at [Source: [email protected]; line: 1, column: 40] (through reference chain: com.microservices.Review["reos"])" 

मैं undertand मिल नियंत्रक आह्वान हैं समस्या, लेकिन मैं एक जानना चाहता था वसंत को बताने का तरीका है कि Reos enum के साथ प्रत्येक ऑब्जेक्ट के लिए Reos.valomText() के बजाय Reos.fromText() का उपयोग करें।

क्या यह संभव है?

उत्तर

11

मुझे जो चाहिए वह मुझे मिला है।

http://chrisjordan.ca/post/50865405944/custom-json-serialization-for-enums-using-jackson

यह 2 कदम था।

  1. अवहेलना REOs enum की toString विधि

    @Override सार्वजनिक स्ट्रिंग toString() { वापसी पाठ; }

  2. @ जेसन क्रिएटर के साथ एनोटेट रीस एनम के पाठ विधि से।

    @JsonCreator सार्वजनिक स्थिर REOs fromText (स्ट्रिंग पाठ)

और इतना ही है।

मुझे उम्मीद है कि यह दूसरों को एक ही समस्या का सामना करने में मदद कर सकता है।

+2

जेसन क्रिएटर एनोटेशन (चरण 2) ने उस समस्या को हल किया जिस पर मैं काम कर रहा था। अच्छा उत्तर। –

1

आपको एक कस्टम MessageConverter का उपयोग करने की आवश्यकता है जो आपके कस्टम fromText() विधि को कॉल करता है। एक लेख here है जो यह बताता है कि इसे कैसे करें।

आप AbstractHttpMessageConverter<Reos> का विस्तार करते हैं और आवश्यक विधियों को लागू करते हैं, और फिर आप इसे पंजीकृत करते हैं।

+0

मुझे लगता है कि यह केवल तभी काम करता है जब मेरी समीक्षा ऑब्जेक्ट में केवल रेस वैल्यू हो। लेकिन मेरे मामले में ऑब्जेक्ट समीक्षा में कई गुण हैं। तो मुझे समीक्षा वस्तु प्राप्त करने के लिए हर संपत्ति को मानचित्र बनाना होगा। एक और समस्या यह है कि मेरे पास अन्य ऑब्जेक्ट्स हैं जो रीस एनम का उपयोग करती हैं, इसलिए मुझे प्रत्येक ऑब्जेक्ट के लिए कनवर्टर लिखना है। मैं प्रॉपर्टी एडिटर की तरह कुछ लिखने का एक तरीका चाहता हूं, जहां मैं रीस वैल्यू के लिए एक विधि लिखता हूं। – reos

1

मैं व्यक्तिगत रूप से JsonDeserializerjackson प्रदान करके अपनी खुद की deserializer कक्षा लिखना पसंद करता हूं। आपको बस अपने enum के लिए एक deserializer वर्ग लिखने की जरूरत है।इस उदाहरण में:

class ReosDeserializer extends JsonDeserializer<Reos> { 

    @Override 
    public Reos deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 

     ObjectCodec oc = jsonParser.getCodec(); 
     JsonNode node = oc.readTree(jsonParser); 

     if (node == null) { 
      return null; 
     } 

     String text = node.textValue(); // gives "A" from the request 

     if (text == null) { 
      return null; 
     } 

     return Reos.fromText(text); 
    } 
} 

फिर, हम ऊपर वर्ग REOs की एक deserializer वर्ग के रूप में इस प्रकार के रूप में चिह्नित करना चाहिए:

@JsonDeserialize(using = ReosDeserializer.class) 
public enum Reos { 

    // your enum codes here 
} 

सब है कि। हम सब तैयार हैं।

यदि आपको enum के लिए धारावाहिक की आवश्यकता है। आप JsonSerializer को विस्तारित करने और एनोटेशन @JsonSerialize का उपयोग करके एक धारावाहिक वर्ग बनाकर इसी तरह से ऐसा कर सकते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे