POST JSON失败,415不支持的媒体types,Spring 3 mvc

我想发送一个POST请求到一个servlet。 请求通过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是

 $.postJSON = function(url, data, callback) { return jQuery.ajax({ 'type': 'POST', 'url': url, 'contentType': 'application/json', 'data': JSON.stringify(data), 'dataType': 'json', 'success': callback }); }; 

用萤火虫,我看到JSON发送正确:

 {"idProductCategory":1,"description":"Descrizione2"} 

但是我得到415不支持的媒体types。 Spring mvc控制器有签名

  @RequestMapping(value = "/ajax/newproductcategory", method = RequestMethod.POST) public @ResponseBody Integer newProductCategory(HttpServletRequest request, @RequestBody ProductCategory productCategory) 

前几天它的工作,现在不是。 如果需要,我会显示更多的代码。 谢谢

我以前用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 }); }; 

ContentRequestBody使用Content-Type头来确定请求中客户端发送的数据的格式。 Accept头使用@ResponseBody来确定在响应中将数据发送回客户端的格式。 这就是为什么你需要两个头。

我有一个类似的问题,但发现问题是,我忽略了提供一个默认的构造函数的DTO注释@RequestBody。

我相信我跑完全一样的问题。 经过与JSON,JavaScript和服务器打了无数小时后,我发现罪魁祸首:在我的情况下,我在DTO中有一个Date对象,这个Date对象被转换为一个string,所以我们可以显示它的视图与格式:HH:mm。

当JSON信息被发回时,这个Date String对象必须被转换回完整的Date对象,因此我们也需要在DTO中设置它的方法。 大但是你不能在DTO中有两个同名的方法(Overload),即使它们有不同types的参数(String vs Date),因为这会给你带来415 Unsupported Media type错误。

这是我的控制器方法

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

为了使所有的工作,你需要删除datetypes参数的方法。 这个错误是非常令人沮丧的。 希望这可以节省一些小时的debugging。

当我用spring mvc集成spring引导时遇到了这个问题。 我通过添加这些依赖来解决它。

 <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库来进行正确的转换。

添加下面的jar(通过依赖关系或者下载并添加到类path中)。

 <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) { 

希望这可以帮助

一个小方面的说明 – 在开发一个web应用程序的时候偶然发现了这个错误。 我们发现的错误,通过与Firefox海报的服务玩弄,是Json中的字段和值都应该用双引号括起来。 例如..

 [ {"idProductCategory" : "1" , "description":"Descrizione1"}, {"idProductCategory" : "2" , "description":"Descrizione2"} ] 

在我们的例子中,我们通过javascript填充了json,从我听到的情况来看,当处理单引号或双引号时可能会有些混乱。

在这篇文章和其他文章中所说的内容,比如包括“接受”和“内容types”标题,也适用。

希望t'helps。

application/json解决了这个问题之后,将内容types添加到请求中

我pipe理出如何使其工作。 告诉我,如果我错了。 我只用一种方法来序列化/反序列化:我删除了关于这个( @JSONSerialize@JSONDeserialize )的所有注释,并在CustomObjectMapper类中注册了Serializers和Deserializers。 我没有find解释这种行为的文章,但我以这种方式解决。 希望它是有用的。

我有同样的问题。 我不得不按照这些步骤来解决这个问题:

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.创build以下filter:

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

我希望这对某人有用。

最小的REST服务版本:

  • 与Wildfly一起testing
  • jacksonmaven依赖不需要

pom.xml中:

 ... <properties> <springframework.version>4.3.1.RELEASE</springframework.version> </properties> ... <packaging>war</packaging> ... <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <sourceDirectory>src/main/java</sourceDirectory> <finalName>spring-rest-demo</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>dependency-jars/</classpathPrefix> </manifest> </archive> <webXml>${project.basedir}\src\main\webapp\WEB-INF\web.xml</webXml> </configuration> </plugin> </plugins> </build> ... 

的src / main / JAVA / web应用/ WEB-INF / web.xml文件:

 ... <display-name>Spring MVC Application</display-name> <servlet> <servlet-name>RestDemo</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>RestDemo</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ... 

的src / main / JAVA / web应用/ WEB-INF / RestDemo-servlet.xml中:

 ... <mvc:annotation-driven/> <context:component-scan base-package="your.package.path" /> ... 

REST控制器:

没有任何数据检查,仅用于教育目的

 @RestController public class SpringRestServiceImpl implements SpringRestService { @Autowired private VideoGameDao videoGameDao; ... @RequestMapping(value = "/rest/save", method = RequestMethod.POST, consumes = {"application/json"}) @Override public ResponseEntity save(@RequestBody VideoGame videoGame) { return ResponseEntity.ok(videoGameDao.save(videoGame)); } ... } 

如何检查:

curl:

 curl -i -POST -H "Content-Type: application/json" -d "your-json-here" http://yourserver:8080/spring-rest-demo/rest/save 

或邮递员工具

表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

  1. 添加jackson库