2012-04-10 15 views
15

में जैक्सन एनोटेशन को अनदेखा किया जा रहा है मैं एक डोमेन क्लास में एक संपत्ति बनाने की कोशिश कर रहा हूं लेकिन यह आउटपुट जेएसओएन में दिखाई देता है।वसंत

{"id":1,"password":null,"email":"[email protected]","firstName":"John","lastName":"Smith"} 

मेरे डोमेन वर्ग:

@Entity 
public class User { 
    private String mPassword; 
    ... 
    @JsonIgnore 
    public String getPassword() { 
     return mPassword; 
    } 

    public void setPassword(String password) { 
     mPassword = password; 
    } 
    ... 
} 

मेरे springmvc config:

... 
<mvc:annotation-driven/> 
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="favorPathExtension" value="true" /> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json"/> 
     </map> 
    </property> 
    <property name="defaultContentType" value="application/json"/> 
    <property name="defaultViews"> 
     <list> 
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
     </list> 
    </property> 
</bean> 
... 
मैं जैक्सन 2.0 और वसंत 3.1.1

का उत्पादन/उपयोगकर्ताओं/1 उपयोग कर रहा हूँ

और मेरा नियंत्रक:

@Controller 
@RequestMapping("/users") 
public class UserController { 
    private UserService mUserService; 

    public UserController(){} 

    @Inject 
    public void setUserController(UserService userService){ 
     mUserService=userService; 
    } 

    @RequestMapping(value="/{id}", method=RequestMethod.GET) 
    public void getUser(@PathVariable("id") long id, Model model){ 
     model.addAttribute(mUserService.getUser(id)); 
    } 
} 
इस

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1"> 
    <property name="mediaTypes"> 
    <map> 
     <entry key="html" value="text/html"/> 
     <entry key="json" value="application/json"/> 
    </map> 
    </property> 
    <property name="viewResolvers"> 
    <!-- this is not important for your jackson problem --> 
    <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" p:order="2" depends-on="tilesConfigurer"/> 
    </property> 
    <property name="defaultViews"> 
    <list> 
     <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> 
    </list> 
    </property> 
</bean> 

मेरे नियंत्रक इस

@Controller 
public class SearchController { 
    @RequestMapping(value="/search", method = {RequestMethod.GET, RequestMethod.POST}) 
    public SearchResponse search(@RequestParam(value = QUERY, required = true) String query) { 
     return generateSearchResponse(query); 
    } 
}  

तरह लग रहा है की तरह

उत्तर

10

समस्या यह है कि वसंत जैक्सन 2.0 के साथ काम नहीं करता है। यह निम्नलिखित तरीके से हल किया गया है:

<bean id="jacksonMessageConverter" 
      class="own.implementation.of.MappingJacksonHttpMessageConverter"/> 

<bean class="org.springframework.web.servlet.mvc 
      .annotation.AnnotationMethodHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <ref bean="jacksonMessageConverter"/> 
      </list> 
     </property> 
     <property name="requireSession" value="false"/> 
    </bean> 

और own.implementation.of.MappingJacksonHttpMessageConverter आधारित है इस पर:

http://www.jarvana.com/jarvana/view/org/springframework/spring-web/3.0.0.RELEASE/spring-web-3.0.0.RELEASE-sources.jar!/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java?format=ok

लेकिन जैक्सन 2.0 के बजाय से ObjectMapper और अन्य जैक्सन कक्षाओं का उपयोग जैक्सन के 1. *

+0

मुझे लगता है कि मैं सिर्फ जैक्सन 1.9 में डाउनग्रेड करूंगा जो मेरी समस्या का समाधान करता है। –

+0

जब तक आपको 2.0 से विशेषताओं की आवश्यकता नहीं होती है (जैसे द्वि-दिशात्मक संबंधों के साथ वस्तुओं को गुजरना)। यही कारण है कि मैं 2.0 में अपग्रेड किया। –

0

मेरे विन्यास लग रहा है मेरे SearchResponse अधिक जटिल संरचना है, लेकिन यह वस्तुओं के इस प्रकार में शामिल है।

@JsonIgnoreProperties({ "popis" }) 
public class Kurz implements Serializable { 
    private String nazev; 
    private String popis; 
} 
+0

संपत्ति जोड़ने से कोई फर्क नहीं पड़ता, शायद इसकी आवश्यकता नहीं है। –

+0

फ़ील्ड पर नॉटेशन को अनदेखा करने का प्रयास करें। मुझे लगता है कि जैक्सन डिफ़ॉल्ट रूप से पढ़ता है और सीधे फॉर्म फ़ील्ड सेट करता है। – chalimartines

+0

मुझे डर है कि काम नहीं किया। मुझे नहीं लगता कि यह जैक्सन का उपयोग कर रहा है - यह जैक्सन जार उपलब्ध होने के बिना जेएसओएन को क्रमबद्ध करने में सक्षम है। इसके अलावा मुझे ContentNegotiatingViewResolver के साथ @ResponseBody का उपयोग नहीं करना चाहिए, इसके बजाय मुझे दृश्य "जेसन" वापस करना चाहिए या इसके बजाय HttpMessageConverter का उपयोग करना चाहिए। –

11

जैक्सन 2 के लिए समर्थन वसंत 3.1.2 में जोड़ा गया है (वसंत 3.2 - SPR-9507 से समर्थित)। बस अपनी परियोजना को वसंत 3.1.1 से वसंत 3.1.2 तक अपग्रेड करें, और जैक्सन 2 आपके पास पहले से मौजूद कॉन्फ़िगरेशन के साथ काम करता है।

8

Spring 3.1.2 के उन्नयन के अलावा, आप भी org.springframework.web.servlet.view.json.MappingJackson**2**HttpMessageConverter

8

को संदेश कनवर्टर बदलने के लिए आप वसंत 4 संस्करण का उपयोग कर रहे हैं, तो है, तुम्हें पता है, निर्भरता निम्नलिखित करना होगा अद्यतन

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.3.3</version> 
    </dependency> 

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.3.3</version> 
</dependency> 

बदलें पुराने कोडहॉस एनोटेशन आयात करने के लिए आयात करते हैं, यदि ऐसा नहीं करते हैं, तो आपकी पुरानी एनोटेशन जेसन इग्नोरप्रॉपर्टीज जैक्सन

import com.fasterxml.jackson.annotation.*; 
के नए संस्करण के साथ काम नहीं करेगी

नीचे से मीडिया टाइप करें, इसे बहिष्कृत कर दिया गया है।

ContentNegotiatingViewResolver

, जरूरत नहीं, ऊपर सक्रियण ढांचे जार से उठाया जाएगा, जैक्सन दृश्य

का उपयोग करना चाहिए MappingJackson2JsonView

<beans:property name="viewResolvers"> 
    <beans:list> 
     <beans:bean 
      class="org.springframework.web.servlet.view.BeanNameViewResolver" /> 
     <beans:bean 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
      <beans:property name="prefix" value="/WEB-INF/views/" /> 
      <beans:property name="suffix" value=".jsp" /> 
     </beans:bean> 
     <beans:bean 
      class="org.springframework.web.servlet.view.tiles3.TilesViewResolver"> 
      <beans:property name="viewClass" 
       value="org.springframework.web.servlet.view.tiles3.TilesView"></beans:property> 
      <beans:property name="order" value="0"></beans:property> 
     </beans:bean> 
    </beans:list> 
</beans:property> 
<beans:property name="defaultViews"> 
    <beans:list> 
     <beans:bean 
      class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> 
    </beans:list> 
</beans:property>