i've been developing a web service using jackson on the server side of the system and accessing it using jersey which is working fine for the get requests however I am running into a brick wall when attempting to post a POJO to the web service as it keeps returning a 415 error.
Server side code which parses the POST request:
public View addFarmer(@RequestBody Farmer farmer) {
farmerService.saveFarmer(farmer);
return new RedirectView("/farmerView/"+ farmer.getFarmerId());
}
Client side class which handles communication with the service:
public Status addFarmer(Farmer farmer) throws UniformInterfaceException, IOException {
ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class, farmer);
return response.getClientResponseStatus();
}
Client side POJO being sent to server:
@XmlRootElement(name="Farmer")
public class Farmer implements Serializable {
private Integer farmerId;
private String farmerName;
public Farmer() { }
public Farmer(Integer farmerId) {
this.farmerId = farmerId;
}
public Integer getFarmerId() { return farmerId; }
public void setFarmerId(Integer farmerId) { this.farmerId = farmerId; }
public String getFarmerName() { return farmerName; }
public void setFarmerName(String farmerName) { this.farmerName = farmerName; }
}
Client side test case:
public void testAddFarmer() throws Exception {
System.out.println("addFarmer");
FarmerRestClient instance = new FarmerRestClient();
Farmer farmer = new Farmer() ;
farmer.setFarmerId(4);
farmer.setFarmerName("farmer4");
Status result = instance.addFarmer(farmer);
assertEquals("200", result);
System.out.println(result);
}
Testing the save functionality using a POJO on the server side works correctly so i'm assumming its something simple which i'm missing when attempting to save the POJO however research on POSTing a POJO to a开发者_StackOverflow rest client seems to come up short on examples. I am relatively new to Jackson and Jersey.
Any assistance would be greatly appreciated,
Leanne
I have updated the configuration xml file to look as follows:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<mvc:annotation-driven />
<beans:bean id="farmerView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<beans:bean id="advisorView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<beans:bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></beans:bean>
<beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jacksonMessageConverter" />
</beans:list>
</beans:property>
</beans:bean>
<beans:bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<beans:property name="mediaTypes">
<beans:map>
<beans:entry key="json" value="application/json" />
</beans:map>
</beans:property>
<beans:property name="viewResolvers">
<beans:list>
<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
</beans:list>
</beans:property>
</beans:bean>
<resources mapping="/resources/**" location="/resources/" />
<beans:import resource="controllers.xml" />
</beans:beans>
And my server side code handling the request to have an accept header as follows:
@RequestMapping(headers="Accept=application/json", method = RequestMethod.POST)
public View addFarmer(@RequestBody Farmer farmer) {
farmerService.saveFarmer(farmer);
return new RedirectView("/farmerView/"+ farmer.getFarmerId());
}
The client code wasnt sending JSON to the server so I updated it to ensure it was:
public Status addFarmer(Farmer farmer) throws UniformInterfaceException, IOException {
String json = mapper.writeValueAsString(farmer);
ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class, json);
return response.getClientResponseStatus();
}
However I am still getting the same error. I am sure this is due to my inexperience with Spring MVC and jackson. I appologise for not mentioning I was using Spring in my original post
The mvc-showcase has good example of a REST based service.
Since you are sending in a farmer (as xml) and expecting back the saved farmer, you should return farmer from your controller and annotate your controller method with @ResponseBody
public @ResponseBody Farmer addFarmer(@RequestBody Farmer farmer) {
Farmer savedFarmer = farmerService.saveFarmer(farmer);
return savedFarmer;
}
The client request should have an Accept header of application/xml or application/json(as appropriate), and your request should go through.
It looks like you're using Spring on the server. I expect 415 is the error you'd get if you don't have an HTTP message converter capable of handling JSON content.
精彩评论