我正在尝试向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)
前几天它有效,现在却没有。如果需要,我会显示更多代码。 感谢
答案 0 :(得分:227)
我在使用Spring @ResponseBody之前就已经发生了这种情况,这是因为没有随请求发送的接受标头。使用jQuery设置Accept标头可能会很麻烦,但这对我有用source
$.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头来确定在响应中将数据发送回客户端的格式。这就是你需要两个标题的原因。
答案 1 :(得分:18)
我遇到了类似的问题,但发现问题是我忽略了为使用@RequestBody注释的DTO提供默认构造函数。
答案 2 :(得分:15)
在application/json
中将内容类型添加到请求中解决了问题
答案 3 :(得分:11)
我相信我遇到了同样的问题。经过无数小时的JSON,JavaScript和服务器的斗争,我找到了罪魁祸首:在我的情况下,我在DTO中有一个Date对象,这个Date对象被转换为一个String,所以我们可以在视图中显示它格式:HH:mm。
当发回JSON信息时,必须将此Date String对象转换回完整的Date对象,因此我们还需要一种方法在DTO中设置它。最重要的是你不能在DTO中拥有两个具有相同名称(Overload)的方法,即使它们具有不同类型的参数(String vs Date),因为这也会给你415 Unsupported Media类型错误。
这是我的控制器方法
@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;
}
}
}
要使一切正常,您需要使用Date type参数删除该方法。这个错误非常令人沮丧。希望这可以节省一些时间的调试。
答案 4 :(得分:9)
我遇到了类似的问题,这就是我修复它的方法,
问题是由于从JSON到Java的转换过程,需要有正确的运行时杰克逊库才能使转换正确发生。
添加以下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) {
希望这有帮助
答案 5 :(得分:8)
当我将弹簧靴与弹簧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>
答案 6 :(得分:5)
一个小小的注意事项 - 在开发Web应用程序时偶然发现了同样的错误。我们通过使用Firefox Poster处理服务而发现的错误是,Json中的字段和值都应该用双引号括起来。比如..
[ {"idProductCategory" : "1" , "description":"Descrizione1"},
{"idProductCategory" : "2" , "description":"Descrizione2"} ]
在我们的例子中,我们通过javascript填充了json,从处理单/双引号开始,这听起来有点令人困惑。
之前在此帖和其他帖子中所说的内容,例如包括“接受”和“内容类型”标题,也适用。
希望得到帮助。
答案 7 :(得分:3)
我设法了解如何让它发挥作用。如果我错了,请告诉我。
我只使用了一种方法来序列化/反序列化:我删除了有关此内容的所有注释(@JSONSerialize
和@JSONDeserialize
)以及CustomObjectMapper
类中注册的序列化程序和反序列化程序。
我没有找到解释这种行为的文章,但我以这种方式解决了。希望它有用。
答案 8 :(得分:1)
我遇到了同样的问题。我必须按照以下步骤解决问题:
<强> 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>
我希望这对某人有用。
答案 9 :(得分:0)
我通过将jackson-json数据绑定添加到我的pom来解决了这个问题。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.3</version>
</dependency>
答案 10 :(得分:0)
Spring boot + spring 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){
答案 11 :(得分:0)
在您的模型类中添加一个json属性注释,还具有默认的构造函数
@JsonProperty("user_name")
private String userName;
@JsonProperty("first_name")
private String firstName;
@JsonProperty("last_name")
private String lastName;
答案 12 :(得分:0)
我有同样的问题。添加
<mvc:annotation-driven />
<mvc:default-servlet-handler />
到spring-xml解决了
答案 13 :(得分:0)
除了设置 Accept 和 Content-Type 标头,并确保它们与控制器方法的消费/生产设置相匹配之外,您可能还想查看 JSON 结构并确保没有编组和解组。在我的情况下,内容类型没问题,但是将 JSON 请求映射到我的请求/响应模型时存在问题。通常控制器应该返回 400 错误而不是 415 错误,但在我的例子中错误代码是 415。我通过添加一个测试类来调试这个问题,我使用 ObjectMapper 将我的 JSON 读入请求模型对象。 ObjectMapper 因请求而窒息,并给了我有用的错误,帮助我修复了模型类定义。
答案 14 :(得分:-1)
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