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
- 添加jackson库
- 在JSF中创build多个依赖/级联selectOneMenu下拉列表
- 逐渐淡化每一个元素
- 当附加查询string参数或使用POST不是一个选项时,如何避免Internet Explorer 11中的AJAXcaching
- 调用从Ajax响应返回的JavaScript函数
- 为什么jQuery的内存泄漏太严重了?
- 将parameter passing给jQuery的最好方法.load()
- JavaScript的string数组的AJAX Post作为List <String>的JsonResult总是返回空?
- 跨域POST请求不发送Cookie Ajax Jquery
- 我如何说服IE浏览器只显示应用程序/ JSON而不是提供下载?