Пост с JSON выдает 415 неподдерживаемый тип медиа, Весна в MVC 3
Я пытаюсь отправить запрос POST на сервлет. Запрос отправляется через jQuery следующим образом:
var productCategory = new Object();
productCategory.idProductCategory = 1;
productCategory.description = "Descrizione2";
newCategory(productCategory);
где newCategory составляет
function newCategory(productCategory)
{
$.postJSON("ajax/newproductcategory", productCategory, function(
idProductCategory)
{
console.debug("Inserted: " + idProductCategory);
});
}
а постжсон-это
$.postJSON = function(url, data, callback) {
return jQuery.ajax({
'type': 'POST',
'url': url,
'contentType': 'application/json',
'data': JSON.stringify(data),
'dataType': 'json',
'success': callback
});
};
С firebug я вижу, что JSON отправляется правильно:
{"idProductCategory":1,"description":"Descrizione2"}
но я получаю 415 неподдерживаемых типов носителей. Контроллер Spring mvc имеет подпись
@RequestMapping(value = "/ajax/newproductcategory", method = RequestMethod.POST)
public @ResponseBody
Integer newProductCategory(HttpServletRequest request,
@RequestBody ProductCategory productCategory)
несколько дней назад это работало, теперь это не так. Я покажу больше кода, если это необходимо. Спасибо
11 ответов:
У меня это случалось раньше с Spring @ResponseBody, и это было потому, что не было заголовка accept, отправленного с запросом. Принять заголовок может быть боль, чтобы установить с jQuery, но это сработало для меня источник
$.postJSON = function(url, data, callback) { return jQuery.ajax({ headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, 'type': 'POST', 'url': url, 'data': JSON.stringify(data), 'dataType': 'json', 'success': callback }); };
заголовок Content-Type используется @RequestBody для определения формата данных, отправляемых от клиента в запросе. Заголовок accept используется @ResponseBody для определения формата, в котором данные должны быть отправлены обратно клиенту ответ. Вот почему вам нужны оба заголовка.
У меня была аналогичная проблема, но я обнаружил, что проблема заключалась в том, что я забыл предоставить конструктор по умолчанию для DTO, который был аннотирован с помощью @RequestBody.
Я считаю, что я столкнулся точно с той же проблемой. После бесчисленных часов борьбы с JSON, JavaScript и сервером я нашел виновника: в моем случае у меня был объект даты в DTO, этот объект даты был преобразован в строку, чтобы мы могли показать его в представлении с форматом: HH: mm.
когда информация JSON отправлялась обратно, этот объект строки даты должен был быть преобразован обратно в полный объект даты, поэтому нам также нужен метод для его установки в DTO. Большой, но вы не можете иметь 2 метода с тем же именем (перегрузка) в DTO, даже если они имеют другой тип параметра (строка против даты), потому что это даст вам также 415 неподдерживаемых ошибок типа носителя.
Это был мой метод контроллера
@RequestMapping(value = "/alarmdownload/update", produces = "application/json", method = RequestMethod.POST) public @ResponseBody StatusResponse update(@RequestBody AlarmDownloadDTO[] rowList) { System.out.println("hola"); return new StatusResponse(); }
Это был мой пример DTO (id get / set и методы preAlarm get не включены для краткости кода):
@JsonIgnoreProperties(ignoreUnknown = true) public class AlarmDownloadDTO implements Serializable { private static final SimpleDateFormat formatHHmm = new SimpleDateFormat("HH:mm"); private String id; private Date preAlarm; public void setPreAlarm(Date date) { this.preAlarm == date; } public void setPreAlarm(String date) { try { this.preAlarm = formatHHmm.parse(date); } catch (ParseException e) { this.preAlarm = null; } catch (NullPointerException e){ this.preAlarm = null; } } }
чтобы все работало, вам нужно удалить метод с параметром типа даты. Эта ошибка очень неприятно. Надеюсь, это может сэкономить кому-то часы отладки.
я столкнулся с этой проблемой, когда я интегрировал spring boot с spring mvc. Я решил это, просто добавив эти зависимости.
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency>
я столкнулся с подобной проблемой, и вот как я это исправил,
проблема связана с процессом преобразования из JSON в Java, нужно иметь правильное время выполнения jackson библиотеки для преобразования происходит правильно.
добавить следующие банки (через зависимость или путем загрузки и добавления в classpath.
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency>
Это должно решить проблему.
Полный Код:
function() { $.ajax({ type: "POST", url: "saveUserDetails.do", data: JSON.stringify({ name: "Gerry", ity: "Sydney" }), headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, success: function(data) { if (data.status == 'OK') alert('Person has been added'); else alert('Failed adding person: ' + data.status + ', ' + data.errorMessage); }
и подпись контроллера выглядит вот так:
@RequestMapping(value = "/saveUserDetails.do", method = RequestMethod.POST) public @ResponseBody Person addPerson( @RequestBody final Person person) {
надеюсь, что это помогает
небольшая ремарка - наткнулся на эту же ошибку при разработке веб-приложения. Ошибка, которую мы обнаружили, играя с сервисом с плакатом Firefox, заключалась в том, что оба поля и значения в Json должны быть окружены двойными кавычками. Например..
[ {"idProductCategory" : "1" , "description":"Descrizione1"}, {"idProductCategory" : "2" , "description":"Descrizione2"} ]
в нашем случае мы заполнили json через javascript, что может быть немного запутанным, когда речь заходит о работе с одинарными/двойными кавычками, из того, что я слышал.
что было сказано ранее в этом и другие сообщения, такие как заголовки "Accept" и "Content-Type", также применяются.
Надежда Т'helps.
мне удалось сделать так, чтобы это работало. Скажи мне, если я ошибаюсь. Я использовал только один способ сериализации/десериализации: я удалил все комментарии относительно этого (
@JSONSerialize
и@JSONDeserialize
) и зарегистрированные сериализаторы и Десериализаторы вCustomObjectMapper
класса. Я не нашел статьи, объясняющей это поведение, но я решил таким образом. Надеюсь, что это полезно.
у меня была та же проблема. Я должен был выполнить следующие действия, чтобы решить эту проблему:
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>
Я надеюсь, что это кому-то полезно.
Я решил эту проблему, добавив привязку данных jackson-json к моему pom.
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.3</version> </dependency>
1.a. добавьте следующее в applicationContext-mvc.xml
xmlns:mvc="http://www.springframework.org/schema/mvc" xsi: schemaLocation=" http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc
- добавить библиотеку Джексон