发布JSON失败,415不支持的媒体类型,Spring 3 MVC

我正在尝试向Servlet发送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是

$.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)

几天前它起作用了,现在不行了。如果需要,我将显示更多代码。

532252 次浏览

我以前在Spring@ResponseBody中遇到过这种情况,这是因为没有与请求一起发送的Accept头。使用jQuery设置Accept Header可能是一件痛苦的事情,但,这对我来说是可行的。

$.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
});
};

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

我想出了如何让它工作。如果我错了,请告诉我。 我只使用了一种方法来序列化/反序列化:我删除了与此相关的所有注释(@JSONSerialize@JSONDeserialize),并在CustomObjectMapper类中注册了序列化程序和反序列化程序。 我没有找到一篇解释这种行为的文章,但我以这种方式解决了。希望有用.

一个小的旁注-在开发Web应用程序时偶然发现了同样的错误。通过使用Firefox Poster的服务,我们发现的错误是JSON中的字段和值都应该用双引号括起来。例如..

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

在我们的例子中,我们通过JavaScript填充JSON,据我所知,在处理单引号/双引号时,这可能会有点令人困惑。

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

希望能帮上忙。

我遇到过类似的问题,但发现问题在于我忽略了为使用@RequestBody注释的DTO提供默认构造函数。

我相信我也遇到了同样的问题。在与JSON、JavaScript和服务器进行了无数个小时的斗争之后,我找到了罪魁祸首:在我的例子中,我在DTO中有一个Date对象,这个Date对象被转换为一个字符串,这样我们就可以在视图中以:HH:mm格式显示它。

当JSON信息被发送回来时,这个日期字符串对象必须被转换回一个完整的日期对象,因此我们还需要一个方法来在DTO中设置它。重要的是,你不能在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获取/设置和预警获取方法):

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

要使一切正常工作,您需要删除带有日期类型参数的方法。这个错误非常令人沮丧。希望这可以节省某人的调试时间。

1.a.在applicationContext-MVC.XML中添加以下内容

xmlns:MVC=“ http://www.springframework.org/schema/mvc ” xsi:schemaLocation= http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc

  1. 添加杰克逊库

我遇到过类似的问题,这就是我解决它的方法。

这个问题是由于从JSON到Java的转换过程,需要有正确的运行时Jackson库才能正确进行转换。

添加以下JAR(通过依赖项或通过下载并添加到类路径)。

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

希望这能有所帮助

我也有同样的问题。我必须按照以下步骤来解决这个问题:

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>

创建以下过滤器:

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

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

我希望这对某些人有用。

当我将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>

将内容类型作为application/json添加到请求中解决了此问题

我通过将Jackson-JSON数据绑定添加到我的POM解决了这个问题。

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.3</version>
</dependency>

弹簧护套+弹簧MVN

有问题

@PostMapping("/addDonation")
public String addDonation(@RequestBody DonatorDTO donatorDTO) {

用溶液

@RequestMapping(value = "/addDonation", method = RequestMethod.POST)
@ResponseBody
public GenericResponse addDonation(final DonatorDTO donatorDTO, final HttpServletRequest request){

在你的模型类中添加一个JSON属性注释,也有一个默认的构造函数

@JsonProperty("user_name")
private String userName;


@JsonProperty("first_name")
private String firstName;


@JsonProperty("last_name")
private String lastName;

我也有同样的问题。正在添加

<mvc:annotation-driven />
<mvc:default-servlet-handler />

到spring-XML解决了这个问题。

除了设置Accept和Content-Type头,并确保它们与控制器方法的Consumers/Produces设置相匹配之外,您可能还需要查看JSON结构,并确保编组和解组没有问题。在我的例子中,内容类型是可以的,但是在将JSON请求映射到我的请求/响应模型时出现了问题。通常情况下,控制器应该返回400错误而不是415错误,但在我的例子中,错误代码是415。我通过添加一个测试类来调试这个问题,其中我使用ObjectMapper将我的JSON读取到请求模型对象中。ObjectMapper阻塞了请求,并给出了有用的错误,帮助我修复了模型类定义。