Spring-Returning json с @ResponseBody, когда заголовок Accept равен * / *, генерирует HttpMediaTypeNotAcceptableException - PullRequest
2 голосов
/ 15 марта 2011

Я использую Spring 3.0.0.

У меня есть конечная точка, которая возвращает объект, который я хочу сериализовать в JSON.Когда приходит запрос с Accept: application / json, он работает правильно.В настоящее время поступает запрос с */* в качестве значения Accept.К сожалению, я не могу контролировать запрос, иначе я бы это изменил.При получении */* генерируется исключение HttpMediaTypeNotAcceptableException.

Есть ли способ сопоставить этот шаблон принятия с application / json?

Это очень похоже на другой вопрос, но ключевое отличие в том, что мне нужно, чтобы заголовок Accept был */*. Json Spring не разрешается с соответствующим ответом

Вот как выглядит мой контроллер:

@RequestMapping(value = "/v1/endpoint", method = RequestMethod.POST)
@ResponseBody
public EndpointResponse runEndpoint(@RequestBody String jsonData) {

    ObjectMapper mapper = new ObjectMapper();
    EndpointRequest opRequest = null;
    EndpointResponse opResponse = null;

    try {

        opRequest = mapper.readValue(jsonData, EndpointRequest.class);

        //....do stuff



    } catch (JsonParseException e) {
        return handleException(opResponse, e);
    } catch (JsonMappingException e) {
        return handleException(opResponse, e);
    } catch (IOException e) {
        return handleException(opResponse, e);
    }

    return opResponse;
}

Спасибо!

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

Из всего, что я собрал сегодня, есть 2 варианта, чтобы обойти эту проблему.

  1. Напишите BeanPostProcessor, который будет обновлять поддерживаемые типы пантомимы на MappingJacksonConverter для принятия / .(использование свойства supportMimeTypes просто не работает .... см. https://jira.springsource.org/browse/SPR-6214

  2. Вот решение, с которым я сейчас работаю. Это не красиво, но и не устанавливает заголовок Accept для / , когда вы ожидаете application / json каждый раз. Я закончил тем, что добавил объект ServletResponse в свой метод и использовал старый способ записи непосредственно в выходной поток, чтобы обойти конвертеры сообщений и получить мой ответный ответ.


@RequestMapping(value = "/v1/endpoint", method = RequestMethod.POST)
public void runEndpoint(@RequestBody String jsonData,
ServletResponse response) {

    ObjectMapper mapper = new ObjectMapper();
    EndpointRequest opRequest = null;
    EnpointResponse opResponse = null;
    StringWriter sw = new StringWriter();

    try {

        opRequest = mapper.readValue(jsonData, EndpointRequest.class);

        opResponse = ...do stff...

        mapper = new ObjectMapper();

        mapper.writeValue(sw, opResponse);

        response.setContentType("application/json");
        response.getOutputStream().write(sw.toString().getBytes());

        } catch (JsonParseException e) {
        handleException(opResponse, e, response);
        } catch (JsonMappingException e) {
        handleException(opResponse, e, response);
        } catch (IOException e) {
        handleException(opResponse, e, response);
    }
}

Если у вас есть что-нибудь более изящное, я бы хотел это увидеть!

1 голос
/ 09 апреля 2011

Я только что столкнулся с этой же проблемой.Я не уверен, что это более элегантно, но я решил просто вернуть строку и сам преобразовать объект в Json.Я решил использовать Gson для библиотеки JSON.

@Controller
public class NewAbstractController  {

   @RequestMapping(value = "/simple", method = RequestMethod.GET)
   public @ResponseBody String SayHello()
   {
       Foo foo = new Foo();
       foo.Name = "Chris";
       foo.age = 30;

       Gson gson = new Gson();
       return gson.toJson(foo);
   }

   public class Foo implements Serializable
   {
       public String Name;
       public Integer age;
   }

}
0 голосов
/ 13 января 2012

Включите эти зависимости в ваш pom.xml

 <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.3</version>
 </dependency>

 <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.3</version>
  </dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...