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