5

複数の出力タイプをサポートするために、MessageConvertersの代わりにContentNegotiatingViewResolverを使用するようにコントローラーに変換しました。jsonでは、MappingJacksonJsonViewを使用しています。

<bean
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1" />
    <property name="mediaTypes">
        <map>
            <entry key="html" value="text/html"/>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
        </map>
    </property>
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                <constructor-arg>
                    <bean class="org.springframework.oxm.xstream.XStreamMarshaller" />
                </constructor-arg>
            </bean>                         
        </list>
    </property>
    <property name="ignoreAcceptHeader" value="true" />
    <property name="defaultContentType" value="application/json" />
</bean>

次のコントローラーロジックを使用します。

@RequestMapping(value = "/id/{id}", method = RequestMethod.GET)
public ModelAndView getById(@PathVariable (value="id") String id) {
    MyObject ret = doGetById(id);
    ModelAndView modelAndView = new ModelAndView("common/single");
    modelAndView.addObject("myObject", ret);
    return modelAndView;
}

/id/1234.jsonにアクセスするとjsonが返されるのは次のようなものです。

{
   myObject: {
        field1:"abc",
        field2:"efg"
   }
}

myObjectを結果の最上位ノードとして設定して、代わりに次のように設定する方法はありますか?

{
    field1:"abc",
    field2:"efg"
}
4

3 に答える 3

9

何が起こっているのかというと、SpringMVCはModelAndViewを取得してJSONにシリアル化しています。ModelAndViewはマップのように見えるため、この場合、マップにはmyObjectというキー名を持つエントリが1つだけあります。これは、JSON応答が見るものです。オブジェクトだけを取得するには、ModelAndViewではなくオブジェクトだけを返し、JacksonにオブジェクトをJSONにシリアル化させる必要があります。

ModelAndViewを返すのではなく、MyObjectを返し、メソッドに。で注釈を付けます@ResponseBody。これにより、コントローラーメソッドは次のようになります。

@RequestMapping(value="/id/{id}", method=RequestMethod.GET, produces="application/json")
public @ResponeBody MyObject getById(@PathVariable (value="id") String id) {
    return doGetById(id);
}
于 2012-07-18T15:19:34.690 に答える
2

私は同じ問題に直面し、次の解決策が私のために働きます。

<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
   <property name="prefixJson" value="true" />
</bean>
于 2012-07-22T13:49:04.330 に答える
2

次のコマンドを使用して、外部ノードを削除できるはずですMappingJacksonJsonView.setExtractValueFromSingleKeyModel(true)

単一の属性を含むモデルをマップとしてシリアル化するか、モデルから単一の値を抽出して直接シリアル化するかを設定します。

このフラグを設定する効果は、@ResponseBodyリクエスト処理メソッドでMappingJacksonHttpMessageConverterを使用する場合と同様です。

例えば:

private final MappingJacksonJsonView view = new MappingJacksonJsonView();

public MyController() {
     view.setExtractValueFromSingleKeyModel(true);
}

@RequestMapping(value = "/id/{id}", method = RequestMethod.GET)
public ModelAndView getById(@PathVariable (value="id") String id) {
    MyObject ret = doGetById(id);
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setView(this.view);
    modelAndView.addObject("myObject", ret);
    return modelAndView;
}

これは、構成を介して実行する場合にも機能するはずです。

<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
    <property name="extractValueFromSingleKeyModel" value="true" />
</bean>
于 2013-08-15T01:13:31.287 に答える