0

ResponseBodyを使用してjsonとxmlの応答を返そうとしていますが、xmlでは正常に機能しますが、jsonは返されません。xmlのリクエストURIは「../home.xml」で、jsonのリクエストはコントローラーメソッドの「../home.json」です。

@RequestMapping("home.*")
public  @ResponseBody Message homeOther(HttpServletRequest request, HttpServletResponse response, ModelMap mv){
    Message msg = new Message();
    msg.setDetail("I am here at home");
    msg.setUploadDate(new Date());

    mv.addAttribute("message", msg);

    return msg;
}

そして、これがディスパッチャサーブレットです。

<context:component-scan base-package="com.ym"/>

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="alwaysUseFullPath" value="true"/>
</bean>


<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
    <property name="resourceLoaderPath" value="/views"/>
</bean>

<!-- Simple ViewResolver for Velocity, appending ".vm" to logical view names -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
    <property name="order" value="2" />
    <property name="cache" value="true"/>
    <property name="prefix" value=""/>
    <property name="suffix" value=".vm"/>
    <property name="toolboxConfigLocation" value="/WEB-INF/toolbox.xml"/>
    <!-- if you want to use the Spring Velocity macros, set this property to true -->
    <property name="exposeSpringMacroHelpers" value="true"/>
    <property name="contentType" value="text/html; charset=UTF-8" />
</bean>

<bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller" />


<bean id="xmlView" class="org.springframework.web.servlet.view.xml.MarshallingView"
      >
      <constructor-arg ref="xstreamMarshaller" />
</bean>

<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonHttpMessageConverter" />
            <ref bean="marshallingHttpMessageConverter" />
        </list>
    </property>
</bean>

<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json" />
</bean>

<bean id="marshallingHttpMessageConverter"
      class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <property name="marshaller" ref="xstreamMarshaller"/>
    <property name="unmarshaller" ref="xstreamMarshaller"/>
</bean>



<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="order" value="1" />
  <property name="mediaTypes">
    <map>
       <entry key="json" value="application/json" />
       <entry key="xml" value="application/xml" />
    </map>
  </property>

  <property name="defaultViews">
    <list>
      <!-- JSON View -->
      <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
      </bean>

      <ref bean="xmlView" />
     </list>
  </property>
  <property name="ignoreAcceptHeader" value="true" />

</bean>

XML応答は次のとおりです。

<com.ym.mongodb.model.Message>
 <messageId>0</messageId>
 <detail>I am here at home</detail>
 <uploadDate>2013-03-09 09:56:46.606 UTC</uploadDate>
</com.ym.mongodb.model.Message>

私の問題は次のとおりです。1。構成で何が摩耗していますか?なぜjson応答を返さないのですか?2.なぜそれが返すxmlは、メッセージの完全修飾名を表示しますか?Spring3.1を使用しています。

編集:興味深いことに、リクエストタイプが適切に設定されている場合、jsonnxmlが正しく作成されます。しかし、それでも2番目の問題は存在します。

4

1 に答える 1

1

あなたが何を達成しようとしているのか詳細がわからないので、私が助けることができるかどうかはわかりませんが、それを試してみます。

まず、acceptヘッダーを追加してみてください。以下に例を示します。

@RequestMapping(value = "/home/yourpath", method = RequestMethod.GET,
headers = "Accept=application/xml, application/json")

acceptヘッダーを追加することにより、jsonおよびxmlリクエストは、メソッドを呼び出したり、たとえばcurlクライアントを使用してデータを解析したりするときに受け入れられます。また、リクエストメソッドを明示的に設定することを検討する必要があるかもしれません。

クライアントにリクエストを送信するときは、送信するコンテンツに応じて、リクエストのヘッダーに「Content-Type:application / json」または「Content-Type:application/xml」が追加されていることを確認してください。そうしないと、間違ったコンテンツタイプを送信する可能性があるため、サポートされていないコンテンツタイプエラーが発生します。

Springで正しいコンテンツタイプを実際に表示する方法は2つあります。

1:リクエストのヘッダーにある適切なコンテンツタイプを解析/受け入れることにより(クライアントでacceptヘッダーを検討することにより)。

2:ファイル拡張子を設定する(箱から出してすぐに機能する特定のデフォルトのファイル拡張子があります。xmlとjsonがカバーされています)。uriの最後に.xmlまたは.jsonを追加してみてください。

こちらをご覧ください:http ://static.springsource.org/spring/docs/3.1.0.RELEASE/reference/htmlsingle/#mvc-multiple-representations

次の例を見てください: http ://www.mkyong.com/spring-mvc/spring-3-mvc-contentnegotiatingviewresolver-example/

私はあなたの2番目の問題であなたを助けることができません。

これがお役に立てば幸いです。幸運を。

よろしく、クリス

于 2013-03-09T18:43:00.187 に答える