Ошибка 415 при размещении POJO в остальных веб-сервисах - PullRequest
0 голосов
/ 20 сентября 2011

Я разрабатывал веб-сервис, используя Джексона на стороне сервера системы, и обращался к нему с помощью трикотажа, который работает нормально для запросов на получение, однако я сталкиваюсь с кирпичной стеной при попытке опубликовать POJO в Интернете. сервис, поскольку он продолжает возвращать ошибку 415.

Код на стороне сервера, который анализирует запрос POST:

    public View addFarmer(@RequestBody Farmer farmer) {
        farmerService.saveFarmer(farmer);
        return new RedirectView("/farmerView/"+ farmer.getFarmerId());
    }

Клиентский класс, который обрабатывает связь со службой:

    public Status addFarmer(Farmer farmer) throws UniformInterfaceException, IOException {
        ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class, farmer);
        return response.getClientResponseStatus();
    }

POJO на стороне клиента отправляется на сервер:

   @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; } 

}

Тестовый пример на стороне клиента:

   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);
    }

Тестирование функции сохранения с использованием POJO на стороне сервера работает правильно, поэтому я предполагаю, что это что-то простое, чего мне не хватает при попытке сохранить POJO, однако исследования по размещению POJO в клиенте отдыха кажутся короткими на примерах. Я относительно новичок в Джексоне и Джерси.

Любая помощь будет принята с благодарностью,

Лианы


Я обновил XML-файл конфигурации, чтобы он выглядел следующим образом:

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

И мой код на стороне сервера обрабатывает запрос на получение заголовка принятия следующим образом:

    @RequestMapping(headers="Accept=application/json", method = RequestMethod.POST)
    public View addFarmer(@RequestBody Farmer farmer) {
        farmerService.saveFarmer(farmer);
        return new RedirectView("/farmerView/"+ farmer.getFarmerId());
    }

Код клиента не отправлял JSON на сервер, поэтому я обновил его, чтобы убедиться, что он:

   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();
    }

Однако я все еще получаю ту же ошибку. Я уверен, что это связано с моей неопытностью в Spring MVC и Джексоне. Я прошу прощения за то, что не упомянул, что я использовал Spring в своем оригинальном сообщении

Ответы [ 2 ]

0 голосов
/ 20 сентября 2011

Похоже, вы используете Spring на сервере. Я ожидаю, что ошибка 415 вы получите, если у вас нет конвертера HTTP-сообщений , способного обрабатывать содержимое JSON.

0 голосов
/ 20 сентября 2011

mvc-витрина имеет хороший пример службы на основе REST.

Поскольку вы отправляете фермеру (в формате xml) и ожидаете возврата сохраненного фермера, вы должны вернуть фермера из вашего контроллера и аннотировать метод контроллера с помощью @ ResponseBody

    public @ResponseBody Farmer addFarmer(@RequestBody Farmer farmer) {
        Farmer savedFarmer = farmerService.saveFarmer(farmer);
        return savedFarmer;
    }

Клиентский запрос должен иметь заголовок Accept application / xml или application / json (в зависимости от ситуации), и ваш запрос должен быть обработан.

...