2012-12-29 45 views
2

所以我得到了json的工作方式,其中有人可以用json形式發佈對象,而我的控制器方法將其映射到實際的java對象。我的Spring配置XML是什麼樣子:爲json和xml設置安靜的端點的Spring MVC

<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?

例如說我有一個密碼屬性,我不希望任何人能夠發佈此信息。

+0

製作如果它適合你,則習慣於upvote /接受答案 –

回答

2

我使用的是Spring 3.1,這就是我所做的。 在調度員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罐子。

0

您可以通過RequestMapping註釋的consumes屬性告訴a方法它將使用哪些類型。

I.E.來自Spring文檔:

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

注意:這是一個以逗號分隔的列表,因此您也可以擁有application/xml。

重要的是要注意,這隻會接受那些內容類型,它會給你一個安全位,但可能會導致意想不到的結果。我的意思是,如果您發送/pets text/plain,則不會調用該方法。

要執行正確的綁定,請檢查通過HttpServletRequest發送的內容類型,並根據您正在處理的類型進行解組。

0

我用這一個同時處理:

@RequestMapping(value = "/{id}", 
method = RequestMethod.GET, 
headers ={"Accept=application/json,application/xml"}, 
produces={"application/json", "application/xml"})