2

そのため、誰かがオブジェクトをjson形式で投稿できる場所でjsonを機能させ、コントローラーメソッドがそれを実際のJavaオブジェクトにマップします。私の春の設定xmlは次のようになります:

 <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <util:list id="beanList">
                <ref bean="jsonMessageConverter"/>
            </util:list>
        </property>
    </bean>

動作するテスト コントローラー メソッドは次のようになります。

    @ResponseBody
    @RequestMapping(value = "/create", method = RequestMethod.POST)
    public String create(@RequestBody User user, HttpServletRequest request, HttpServletResponse response) {

        return user.getName();
    }

まったく同じ方法をxmlでも使用したい場合、これは可能ですか? どのメッセージ コンバーターを使用しますか?

ところで、プライベートの特定のプロパティを保持したい場合、json と xml の両方で機能するようにするにはどうすればよいですか?

たとえば、私はパスワード プロパティを持っているとします。この情報をだれにも投稿できないようにしたいと思います。

4

5 に答える 5

2

私はSpring 3.1を使用していますが、これが私のやり方です。dispatcher-servelet.xml 内

   <bean id="jacksonObjectMapper" class="com.parth.web.CustomJacksonMapper"/>
    <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="aliases">
        <props>
            <prop key="event">com.parth.model.Event</prop>
        </props>
        </property>
        <property name="annotatedClasses">
        <list>
            <value>com.parth.model.Event</value>
        </list>
    </property>
    </bean>

    <oxm:jaxb2-marshaller id="jaxb2Marshaller">
        <oxm:class-to-be-bound name="com.parth.model.Event"/>
    </oxm:jaxb2-marshaller>

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="false">
            <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter" p:marshaller-ref="xstreamMarshaller" p:unmarshaller-ref="xstreamMarshaller"/>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" p:objectMapper-ref="jacksonObjectMapper" />
        </mvc:message-converters>
    </mvc:annotation-driven>

そしてコントローラでは、

@RequestMapping(value="/",method= RequestMethod.GET)
    @ResponseBody
    public List<Event> getAllEvents(@RequestParam("userId")  String userId, HttpServletResponse response){
        return  eventService.getAll(userId);
    }

ここで、クライアントから HTTP リクエストを作成するときは、必ずAcceptヘッダーを で設定してくださいappliction/json or application/xml

フィールドを省略する限り、アノテーション@JsonIgnore(Jackson の場合) および/または@XStreamOmitField(XStream の場合) を使用できます。

クラスパスに Jackson および XStream jar があることを確認してください。

于 2012-12-31T14:39:24.340 に答える
0

RequestMappingアノテーションのconsumes属性を使用して、メソッドがどのタイプを消費するかをメソッドに伝えることができます。

SpringドキュメントのIE:

@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")

注:これはコンマ区切りのリストであるため、application/xmlも使用できます。

また、これはこれらのコンテンツタイプのみを受け入れるため、多少の安全性が得られますが、予期しない結果が生じる可能性があることに注意してください。つまり、/petstext / plainを送信すると、メソッドは呼び出されません。

正しいバインディングを行うには、を介して送信されたコンテンツタイプを調べ、HttpServletRequest処理しているタイプに応じてマーシャリングを解除します。

于 2012-12-31T15:00:46.387 に答える
0

私はこれを使用して両方を処理しています:

@RequestMapping(value = "/{id}", 
method = RequestMethod.GET,
headers ={"Accept=application/json,application/xml"},
produces={"application/json", "application/xml"})
于 2014-08-26T21:45:09.567 に答える
0

それぞれの要件を考慮している限り、 org.springframework.http.converter.xmlパッケージ内の任意の実装を選択できます。

于 2012-12-29T16:03:20.180 に答える