2011-04-24 10 views
8

साथ @JsonView का उपयोग करते हुए मैं अपने वसंत एप्लिकेशन JSONवसंत MVC

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 

में बात कर रहे बनाने के लिए निम्नलिखित सेम परिभाषा का उपयोग कर रहा क्या यह संभव है @JsonView एनोटेशन उपयोग करने के लिए इस संदेश को कनवर्टर सेम के साथ?

+0

सिर्फ आपकी जानकारी के लिए, मैं अंत में अपना खुद का विचार लिखना समाप्त कर दिया – Erik

उत्तर

18

@JsonView जैक्सन JSON प्रोसेसर में v1.4 से already supported है।

न्यू संपादित करें: जैक्सन 1.9.12

के लिए अपडेट किया गया v1.8.4 documentation समारोह मैं writeValueUsingView उपयोग कर रहा था के अनुसार अब है पदावनतउपयोग ObjectMapper.viewWriter (java.lang.Class) के बजाय और नरक; हालांकि यह भी से 1.9 के बाद, लेखक WithView (कक्षा) के बजाय का उपयोग करें! (V1.9.9 documentation देखें)

तो यहाँ एक अद्यतन उदाहरण, स्प्रिंग 3.2.0 और जैक्सन 1.9.12 जो केवल {id: 1} और नहीं बढ़ाया {name: "name"} रिटर्न के बाद से यह .writerWithView(Views.Public.class) उपयोग कर रहा है के साथ परीक्षण किया है। Views.ExtendPublic.class पर स्विच किया जा {"id":1,"name":"name"}

package com.demo.app; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody; 

import org.codehaus.jackson.map.annotate.JsonView; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.ObjectWriter; 

import javax.servlet.http.HttpServletResponse; 

import java.io.IOException; 

@Controller 
public class DemoController { 
    private final ObjectMapper objectMapper = new ObjectMapper(); 

    @RequestMapping(value="/jsonOutput") 
    @ResponseBody 
    public String myObject(HttpServletResponse response) throws IOException { 
     ObjectWriter objectWriter = objectMapper.writerWithView(Views.Public.class); 
     return objectWriter.writeValueAsString(new MyObject()); 
    } 

    public static class Views { 
     static class Public {} 
     static class ExtendPublic extends Public {} 
    } 

    public class MyObject { 
     @JsonView(Views.Public.class) Integer id = 1; 
     @JsonView(Views.ExtendPublic.class) String name = "name"; 
    } 
} 

पिछला संपादित में परिणाम होगा: आप ObjectMapper का दृष्टांत और दिखाए गए अनुसार here एक कस्टम दृश्य का उपयोग कर वस्तु को लिखने के लिए, या इस उदाहरण में की जरूरत है:

विचारों को परिभाषित करें:

class Views { 
    static class Public {} 
    static class ExtendedPublic extends PublicView {} 
    ... 
} 

public class Thing { 
    @JsonView(Views.Public.class) Integer id; 
    @JsonView(Views.ExtendPublic.class) String name; 
} 

उपयोग विचार:

private final ObjectMapper objectMapper = new ObjectMapper(); 

@RequestMapping(value = "/thing/{id}") 
public void getThing(@PathVariable final String id, HttpServletResponse response) { 
    Thing thing = new Thing(); 
    objectMapper.writeValueUsingView(response.getWriter(), thing, Views.ExtendPublic.class); 
} 

यदि आप जैक्सन> = 1.7 का उपयोग कर रहे हैं तो आपको लगता है कि @JSONFilter आपकी आवश्यकताओं के अनुरूप बेहतर है।

+0

हां, लेकिन मैपर को किस दृश्य को प्रस्तुत करने के बारे में पता है? – Erik

+0

मुझे नहीं लगता कि मैपर जान सकता है। आपको ऑब्जेक्ट स्वयं लिखना है। मैंने अपना जवाब संपादित कर लिया है, लेकिन '@ JSONFilter' के लिए एक लिंक भी जोड़ा है जो आपके लिए बेहतर हो सकता है। चूंकि मेरे उत्तर में उदाहरण हमेशा जेएसओएन स्वरूपित आउटपुट लिखेंगे। यदि आपको अन्य आउटपुट प्रारूपों का समर्थन करने की आवश्यकता है तो यह आपके लिए काम नहीं करेगा। – andyb

+1

कृपया, इसे एक नई सुविधा के लिए वोट दें: https://jira.springsource.org/browse/SPR-7156?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel –

7

@ जेसन व्यू एनोटेशन वसंत पर समर्थित नहीं था लेकिन यह समस्या हल हो गई है!
का पालन करें this

जैक्सन क्रमबद्धता विचारों के लिए समर्थन जोड़ें

वसंत MVC अब Jackon की क्रमबद्धता विचारों अलग नियंत्रक से एक ही POJO की विभिन्न सबसेट प्रतिपादन तरीकों के लिए (उदाहरण के लिए विस्तृत पेज बनाम सारांश दृश्य का समर्थन करता है)। समस्या: एसपीआर -7156

यह SPR-7156 है।

स्थिति: हल

विवरण

जैक्सन के JSONView एनोटेशन डेवलपर जो एक विधि के पहलुओं serialiazed नियंत्रित करने के लिए अनुमति देता है। वर्तमान कार्यान्वयन के साथ, जैक्सन व्यू लेखक का उपयोग किया जाना चाहिए, लेकिन फिर सामग्री प्रकार उपलब्ध नहीं है। यह बेहतर होगा अगर अनुरोधबॉडी एनोटेशन के हिस्से के रूप में, एक JSONView निर्दिष्ट किया जा सकता है।

उपलब्ध Spring ver >= 4.1

पर आप स्प्रिंग धन्यवाद!

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