2011-08-22 19 views
6

मैं के माध्यम से एक विशेष जावा ऑब्जेक्ट इसे सहेजने के लिए करने के लिए एक JSON पोस्ट मानचित्रण हाइबरनेटवसंत MVC: @ResponseBody, 415 असमर्थित मीडिया प्रकार

अजाक्स कॉल के हेडर समस्या हो रही है ठीक से सेट कर रहे हैं ...

Accept   application/json 
Content-Type application/json; charset=UTF-8 

और HTTP-विधि पोस्ट

यहाँ मेरी विन्यास आता है ...

,210

मेरे वसंत MVC समारोह मानचित्रण इस

@RequestMapping(value = {"/save.json"},method = RequestMethod.POST) 
public ModelMap save(@RequestBody Seizure seizureObj,Model model) { 
    ... 
} 
मेरी कंटेनर एक्सएमएल में

की तरह लग रहा है कि मैं इस

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="html" value="text/html" /> 
      <entry key="json" value="application/json" /> 
     </map> 
    </property> 
    <property name="viewResolvers"> 
     <list> 
      <bean id="viewResolver" 
       class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
       <property name="prefix" value="/WEB-INF/assets/" /> 
       <property name="suffix" value=".jsp" /> 
      </bean> 
     </list> 
    </property> 
    <property name="defaultViews"> 
     <list> 
      <bean 
       class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> 
       <property name="prefixJson" value="false" /> 
       <property name="objectMapper" ref="jacksonObjectMapper" /> 
      </bean> 
     </list> 
    </property> 
</bean> 

की तरह मेरे कंटेनर एक्सएमएल में भाग जैक्सन

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapterConfigurer" 
    init-method="init"> 

    <property name="messageConverters"> 
     <list> 
      <bean id="marshallingHttpMessageConverter" 
       class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" 
      > 
      <property name="objectMapper" ref="jacksonObjectMapper" /> 
      </bean> 
     </list> 
    </property> 
</bean> 

<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" /> 
के लिए एक ContentNegotiatingViewResolver है

मेरे पास

है 0
  • जैक्सन कोर-ASL-1.8.5
  • जैक्सन-नक्शाकार-ASL-1.8.5
मेरी/lib फ़ोल्डर में

और जैक्सन इस

की तरह एक साधारण मामले के लिए काम करता है
public class Simple { 
    private int id; 

    public int getId() { 
    return id; 
    } 

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

@RequestMapping(value = {"/saveSimple.json"},method = RequestMethod.POST) 
public ModelMap save(@RequestBody Simple simple,Model model) { 
    ... 
} 

जब मैं कर्ल

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":1}' http://<URL>/saveSimple.json 
साथ परीक्षण

कोई समस्या नहीं है, लेकिन अगर मैं यह हाइबरनेट वस्तु के साथ परीक्षण मैं संदेश

415 Unsupported Media Type 

किसी भी विचार मिलता है।

उत्तर

13

StanMax नेतृत्व मेरी सही दिशा में ...

सबसे पहले मैं @JsonManagedReference और @JsonBackReference सही स्थापित करने के लिए किया था।मैं विशेषता है जो एक एक-से-कई रिश्ते की की का प्रतिनिधित्व करता है के लिए ManagedReference निर्धारित करते हैं, लेकिन जाहिरा तौर पर आप कई विशेषता के लिए यह (संग्रह) स्थापित करने के लिए

यहाँ वर्णन देखना है http://wiki.fasterxml.com/JacksonFeatureBiDirReferences

@JsonBackReference संदर्भ की "वापस" हिस्सा है: यह क्रमबद्धता से हटा दिया जाएगा, और आगे संदर्भ के अक्रमांकन के दौरान पुन: निर्माण किया।

  • एनोटेट संपत्ति सेम प्रकार

का होना चाहिए मेरे मामले में समस्या यह थी कि मैं अपने JSON पोस्ट हाइबरनेट आवश्यकताओं से मेल करने में पर्याप्त जानकारी नहीं भेजी।

इसके परिणामस्वरूप एक अपवाद हुआ कि मेरे JSON पोस्ट से हाइबरनेट ऑब्जेक्ट बनाने के लिए उचित फ़ील्ड मौजूद नहीं थे।

मैंने एक परीक्षण यूआरएल बनाया जहां मैंने ऑब्जेक्ट मैपर बनाया और हाथ से जेएसओएन को डी-सीरियल करने की कोशिश की। यह सही त्रुटि संदेश फेंक देता है।

ऐसा लगता है कि वसंत दुर्भाग्य से 415 "असमर्थित मीडिया प्रकार" अपवाद फेंकता है जो थोड़ा भ्रामक है।

तो भविष्य के लिए। इसे पहले हाथ से आज़माएं (उदाहरण शामिल देखें) और आगे बढ़ने से पहले।

ModelMap map = new ModelMap(); 
logger.info("HibernateAware"); 
HibernateAwareObjectMapper mapper = new HibernateAwareObjectMapper(); 
String jsonInput = 
"{" + 
    "\"id\":\"1\"," + 
    "\"matCountry\":{" + 
    "\"id\":\"1\"" + 
    "}" + 
"}"; 
Seizure seizure = mapper.readValue(jsonInput, Seizure.class); // this line throw the exception 

उम्मीद है कि यह किसी की सहायता करेगा।

जेएस

+0

यह पूरी तरह से मेरा दिन बचाता है ... सप्ताह। असल में वास्तव में मिस्लीडिंग त्रुटि संदेश !! यह कैसे संभव है? –

+0

हेहे मुझे उम्मीद है कि आप ऊपर हट गए हैं;) –

+0

+1 - भयानक डीबगिंग चाल। – Martin

4

एक चीज जिसे आप कोशिश कर सकते हैं यह पता लगाने के लिए है कि समस्या जैक्सन के डेटा बाध्यकारी (हाइबरनेट ऑब्जेक्ट को क्रमबद्ध करने में विफल रहता है) या कुछ और है। यह ऑब्जेक्टमैपर मैन्युअल रूप से निर्माण करके किया जा सकता है, यह देखने के लिए कि 'mapper.serializeValueAsString()' कार्य करता है या अपवाद फेंकता है या नहीं।

जैज़न से भरी हुई संपत्तियों के जैक्सन हैंडलिंग के साथ ऐसा करने का एक अच्छा मौका है; यदि ऐसा है, तो आपको jackson hibernate module का उपयोग करने की आवश्यकता हो सकती है क्योंकि यह हाइबरनेट-विशिष्ट विवरणों को संभाल सकता है।

+0

मैं त्रुटि संदेश '' 'defaultReference' मिलती है: वापस संदर्भ प्रकार (java.util.Set) कामयाब प्रकार के साथ संगत नहीं () ' –

2

मुझे एक ही समस्या थी। MappingJacksonHttpMessageConverter काम करता है के माध्यम से पढ़ने के बाद मुझे एहसास हुआ कि मैंने इसे ठीक से शुरू नहीं किया था। तो मैं अपने बाकी-servlet.xml में निम्नलिखित का इस्तेमाल किया और यह काम किया ..

<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json" /> 
     </map> 
    </property> 

    <property name="defaultViews"> 
     <list> 
      <bean 
       class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> 
       <property name="objectMapper"> 
        <ref bean="JacksonObjectMapper" /> 
       </property> 
      </bean> 
     </list> 
    </property> 
    <property name="favorPathExtension" value="false" /> 
    <property name="favorParameter" value="true" /> 
    <property name="useNotAcceptableStatusCode" value="true" /> 
</bean> 

<bean id="JacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" /> 
संबंधित मुद्दे