2011-01-31 1 views
23

このnoob質問を投稿してもらえませんでしたが、私はかなりの間この問題をデバッグしています。私はオブジェクトに基づいてXMLを返すために応答を取得しようとしている小さな問題を抱えている: - そのAPIが呼び出されるにもかかわらず、今Spring MVC 3:@ResponseBodyを使ってXMLを返す

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

を、私のクライアント側は、すべてのXML応答を受信しません。私はいくつかの場所を読んできましたが、XMLマーシャラーやXMLリゾルバを構成する必要があるようですが、既存の構成にその断片を統合する方法がわかりません。私は現在、私の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を参照)Springコンテキストに魔法の以下のビットを追加することによって行うことができます。

<mvc:annotation-driven/> 

とりわけ、提供する:読み取りと書き込みXMLのための

サポートJAXBがクラスパス上に存在する場合。 (あなたはJava6のにしている、またはそうでなければ、あなたのクラスパスにいくつかのJAXBの実装を持っている場合、すなわち)

JAXBが検出された場合、これは文脈でJaxb2RootElementHttpMessageConverterを登録します、とからXMLを吐き出すする機能を提供します@ResponseBody-annotatedメソッドの戻り値

注:あなたの質問は、XMLをレンダリングするためにViewResolverを使用することを推奨しますが、これは必須ではありません。 @ResponseBodyアノテーションは、ビューレイヤーを完全にバイパスするように設計されています。

+0

膨らんだことに同意しました。 Springは、これのための箱の解決策を持つ必要があります。バカバカしい。 – sourcedelica

+0

@ericacm:私はこれについて再考し、ソースコードを見て(そして*文書を再読み込みしました)、最初に考えたよりもはるかに簡単です。編集を参照してください。 – skaffman

+0

クラスパスにjaxb-api-xx.jarがありますが、何もしていないようです。 'SomeObject'クラスのプロパティにJAXBのアノテーションを付けてアノテートする必要がありますか? – limc

7

は、JAXBにalternativesの全世界があることを

<!-- 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"/> 

注、私は例えば、MarshallingViewを定義することです。これはHttpMessageConverterを定義する必要があること

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

注: 次のステップは、

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

それともResponseBodyアノテーションを使用したい場合、それは次のようになります。これを行う方法の完全なサンプルについては、springのマニュアルを参照してください。

+0

に動作することは、Aのいずれかを返すメソッドを作成することが可能です"viewname"または@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でこの問題を解決しました。お使いのモデルオブジェクトの先頭にRequestMappingと@XmlRootElementproduces = MediaType.APPLICATION_XML_VALUEを追加挨拶

2

produces = MediaType.APPLICATION_XML_VALUEを追加してみてください、すなわち

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

はずが

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

@XmlRootElement 
public class SomeObject { 

} 
関連する問題