2011-01-31 15 views
23

के माध्यम से एक्सएमएल लौट रहा है इस नोब सवाल को पोस्ट करने के लिए मुझे क्षमा करें, लेकिन मैं अभी कुछ समय से इस समस्या को डीबग कर रहा हूं। मैं एक्सएमएल वस्तु के आधार पर लौटने के लिए प्रतिक्रिया करने की कोशिश कर एक छोटी सी समस्या आ रही है: - अभीस्प्रिंग एमवीसी 3: @ResponseBody

@RequestMapping(value = "/mylink", method = RequestMethod.GET) 
public @ResponseBody SomeObject doIt() { 
    ... 
} 

, भले ही है कि एपीआई कहा जाता है, मेरे मुवक्किल पक्ष में सभी XML प्रतिक्रिया प्राप्त नहीं होता है । मैं कुछ स्थानों को पढ़ रहा हूं और ऐसा लगता है कि मुझे एक्सएमएल मार्शेलर या एक्सएमएल रिज़ॉलर्स के somesort को कॉन्फ़िगर करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि उस टुकड़े को मेरी मौजूदा कॉन्फ़िगरेशन में कैसे एकीकृत किया जाए। मैं वर्तमान में मेरे servlet.xml में निम्नलिखित विन्यास है: -

<context:component-scan base-package="ss.controller" /> 

<mvc:annotation-driven /> 

<mvc:resources location="/resources/" mapping="/resources/**" /> 

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/app/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

किसी कृपया कैसे मैं अपने servlet.xml को विन्यस्त यह काम कर पाने के लिए के बारे में जाना हो सकता है पर कुछ नमूना विन्यास पोस्ट कर सकते हैं? बहुत धन्यवाद।

उत्तर

22

यह वसंत संदर्भ के लिए जादू की निम्न बिट जोड़कर किया जा सकता है (docs देखें):

<mvc:annotation-driven/> 

जो अन्य बातों के साथ प्रदान करता है:

पढ़ने और एक्सएमएल लिखने के लिए समर्थन , यदि क्लासपाथ पर जेएक्सबी मौजूद है।

JAXB का पता चला है (यानी अगर आप Java6 पर हैं, या अन्यथा अपने classpath पर कुछ JAXB कार्यान्वयन है), इस संदर्भ के साथ एक Jaxb2RootElementHttpMessageConverter में दर्ज किए जाएंगे, और से XML थूक से बाहर करने की क्षमता प्रदान करेगा @ResponseBody -annotated विधि का वापसी मूल्य।

नोट: एक्सएमएल को प्रस्तुत करने के लिए ViewResolver का उपयोग करके आपके प्रश्न सॉर्ट का सुझाव दिया गया है, लेकिन यह आवश्यक नहीं है। @ResponseBody एनोटेशन को व्यू परत को पूरी तरह से बाईपास करने के लिए डिज़ाइन किया गया है।

+0

ब्लोट के बारे में सहमत। वसंत के लिए बॉक्स समाधान से बाहर होना चाहिए। यह हास्यास्पद है। – sourcedelica

+0

@ericacm: मैंने इसके बारे में फिर से विचार किया था और चला गया और स्रोत कोड (और * फिर * दस्तावेज़ीकरण को फिर से पढ़ा) देखा, और यह मैंने पहले सोचा जितना आसान है। संपादन देखें। – skaffman

+0

मेरे पास क्लासपाथ में jaxb-api-xx.jar है, लेकिन ऐसा लगता है कि यह कुछ भी नहीं कर रहा है। क्या मुझे काम करने के लिए जेएक्सबी की एनोटेशन के साथ 'कुछ ऑब्जेक्ट' वर्ग गुणों को एनोटेट करना चाहिए? – limc

7

मुझे क्या करना है जब मैं वसंत का उपयोग कर वस्तुओं की एक एक्सएमएल प्रतिनिधित्व लौटना चाहते, कि मैं जैसे एक MarshallingView परिभाषित करते हैं, है

<!-- XML view using a JAXB marshaller --> 
<bean id="jaxbView" class="org.springframework.web.servlet.view.xml.MarshallingView"> 
    <constructor-arg> 
     <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
      <property name="classesToBeBound"> 
       <list> 
        <value>com.company.AClass</value> 
       </list> 
      </property> 
     </bean> 
    </constructor-arg> 
</bean> 

<!-- Resolve views based on string names --> 
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> 

नोट JAXB को alternatives की एक पूरी दुनिया है कि वहाँ। अगले कदम

@RequestMapping("/request") 
public ModelAndView sample() { 
    return new ModelAndView("jaxbView", "data", "data_to_be_turned_into_xml"); 
} 

है या आप ResponseBody एनोटेशन का उपयोग करना चाहते हैं, तो यह दिखाई देगा:

@RequestMapping("/request") 
@ResponseBody 
public void sample() { 
    return "data_to_be_turned_into_xml" 
} 

ध्यान दें कि यह एक HttpMessageConverter को परिभाषित करने की आवश्यकता है। इसे कैसे करें इस पर एक संपूर्ण नमूने के लिए spring दस्तावेज़ीकरण देखें।

+0

एक विधि है कि या तो एक रिटर्न बनाने के लिए यह संभव है "व्यूनाम" या @ResponseBody? – trusktr

15

मैं MarshallingView

@RequestMapping(value = "actionName.xml", method = RequestMethod.GET) 
public HttpEntity<byte[]> getXml(ModelMap map, HttpServletResponse response) { 

    String xml = generateSomeXml(); 

    byte[] documentBody = xml.getBytes(); 

    HttpHeaders header = new HttpHeaders(); 
    header.setContentType(new MediaType("application", "xml")); 
    header.setContentLength(documentBody.length); 
    return new HttpEntity<byte[]>(documentBody, header); 
} 

सब है कि बिना साथ स्प्रिंग 3 MVC इस समस्या का समाधान।बधाई

2

कोशिश produces = MediaType.APPLICATION_XML_VALUE जोड़ने, यानी

@RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE) 
0

अपने मॉडल वस्तु के शीर्ष करने के RequestMapping को produces = MediaType.APPLICATION_XML_VALUE और @XmlRootElement जोड़ना चाहिए काम करता है

@RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE) 
public SomeObject doIt(){ 
    return new SomeObject(); 
} 

@XmlRootElement 
public class SomeObject { 

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