Spring MVC 415 Неподдерживаемый тип носителя

Я использую Spring 3.2 и пытаюсь использовать запрос post ajax для отправки массива json-объектов. Если это актуально, я избежал всех специальных символов.

Я получаю статус HTTP 415.

Мой контроллер:

@RequestMapping(value = "/save-profile", method = RequestMethod.POST,consumes="application/json")
    public @ResponseBody String saveProfileJson(@RequestBody String[] profileCheckedValues){
        System.out.println(profileCheckedValues.length);
        return "success";
    }

jquery:

jQuery("#save").click(function () {
        var profileCheckedValues = [];
        jQuery.each(jQuery(".jsonCheck:checked"), function () {
            profileCheckedValues.push($(this).val());
        });
        if (profileCheckedValues.length != 0) {
            jQuery("body").addClass("loading");
            jQuery.ajax({
                type: "POST",
                contentType: "application/json",
                url: contextPath + "/sample/save-profile",
                data: "profileCheckedValues="+escape(profileCheckedValues),
                dataType: 'json',
                timeout: 600000,
                success: function (data) {
                    jQuery('body').removeClass("loading");
                },
                error: function (e) {
                    console.log("ERROR: ", e);
                    jQuery('body').removeClass("loading");
                }
            });
        }
    });

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

{
  "id": "534213341",
  "name": "Jack Lindamood",
  "first_name": "Jack",
  "last_name": "Lindamood",
  "link": "https://www.facebook.com/jack",
  "username": "jack",
  "gender": "male",
  "locale": "en_US",
  "updated_time": "2013-07-23T21:13:23+0000"
}

Ошибка:

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method

Почему эта ошибка происходит - кто-нибудь знает?

Ответ 1

Вы можете попробовать с помощью HttpServletRequest. у него нет проблем

  @RequestMapping(value = "/save-profile", method = RequestMethod.POST,consumes="application/json",headers = "content-type=application/x-www-form-urlencoded")
    public @ResponseBody String saveProfileJson(HttpServletRequest request){
       System.out.println(request.getParameter("profileCheckedValues"));
        return "success";
    }

Ответ 2

Вам нужно будет добавить jackclon и jackson-databind в classpath. Spring возьмет его с помощью MappingJacksonHttpMessageConverter

MappingJacksonHttpMessageConverter

Реализация HttpMessageConverter, которая может читать и писать JSON с использованием Jackson ObjectMapper. Отображение JSON можно настроить по мере необходимости с помощью аннотаций, предоставленных Джексоном. Когда требуется дополнительный контроль, пользовательский ObjectMapper может быть введен через свойство ObjectMapper для случаев, когда для определенных типов должны быть предусмотрены специализированные сериализаторы/десериализаторы JSON. По умолчанию этот конвертер поддерживает (application/json).

Ответ 3

1) Добавьте следующие зависимости

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${jackson-version}</version> // 2.4.3
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson-version}</version> // 2.4.3
</dependency>

2) Если вы используете аннотацию @RequestBody в методе контроллера, убедитесь, что вы добавили следующее в xml файл

<mvc:annotation-driven />

Это должно устранить проблему с кодом состояния 415.

Ответ 4

У меня была consume="application/json" в моей конфигурации сопоставления запросов, которая ожидает ввода json. Когда я отправил запрос, который не является входом JSON Spring, он жаловался на 415 Unsupported Media Type. Поэтому удаление consume="application/json" сработало для меня. Поэтому загляните в запрос ввода и тип носителя принятия в вашей подписи метода управления Spring. Несоответствие приведет к ошибке 415. Вероятно, это будет причиной этой проблемы.

Ответ 5

попробуйте изменить json на application/json для типа данных. И как выглядит ваш json: valid? Я никогда не видел, чтобы json преобразовывался в String [] раньше, поэтому эта проблема также является проблемой.

Ответ 6

У меня была та же проблема. Я должен был выполнить следующие действия, чтобы решить проблему:

1. Убедитесь, что у вас есть следующие зависимости:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson-version}</version> // 2.4.3
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson-version}</version> // 2.4.3
    </dependency>

2. Создайте следующий фильтр:

    public class CORSFilter extends OncePerRequestFilter {

        @Override
        protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response, FilterChain filterChain)
                throws ServletException, IOException {

            String origin = request.getHeader("origin");
            origin = (origin == null || origin.equals("")) ? "null" : origin;
            response.addHeader("Access-Control-Allow-Origin", origin);
            response.addHeader("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, DELETE, OPTIONS");
            response.addHeader("Access-Control-Allow-Credentials", "true");
            response.addHeader("Access-Control-Allow-Headers",
                    "Authorization, origin, content-type, accept, x-requested-with");

            filterChain.doFilter(request, response);
        }
    }

3. Применить указанный фильтр для запросов в web.xml

    <filter>
        <filter-name>corsFilter</filter-name>
        <filter-class>com.your.package.CORSFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>corsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Надеюсь, это полезно кому-то.

Ответ 7

У меня была та же проблема, я только что привел приведенную ниже строку кода в spring -servlet.xml, она была в конце этого xml файла. Это сработало.   <mvc:annotation-driven />