我检查了几种不同的方式,还下载了一个新项目,看看有什么检查bug但我仍然不知道答案。
这是我的RestController
@RestController
@RequestMapping(value = "/message")
public class MessageController {
@RequestMapping(value = "/", method = RequestMethod.POST)
public void createMessage(@RequestBody Message message){
System.out.println(message);
}
}
那是我的模特
@Data
@Entity
public class Message {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String sender;
private String telephone;
private String message;
}
必要时Gradle依赖
dependencies {
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.0.pr3'
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
runtime('com.h2database:h2')
runtime('org.postgresql:postgresql')
compileOnly('org.projectlombok:lombok')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
并且在邮递员中我得到了那个错误
{" timestamp":1495992553884," status":415," error": "不支持的媒体类型","例外": " org.springframework.web.HttpMediaTypeNotSupportedException&#34 ;,
" message":"内容类型 '应用程序/ X WWW的窗体-urlencoded;字符集= UTF-8'不支持",
"路径":" / message /" }
这是最简单的休息方式,但我犯了错误?
答案 0 :(得分:9)
在Postman中,在Body下,选择raw
并从显示的下拉菜单中选择JSON,然后编写作为请求正文的JSON,您不能使用form-data
或{ {1}}使用@RequestBody,当绑定为@ModelAttribute时使用它们。
答案 1 :(得分:3)
我使用$.post
Jquery遇到了类似的问题。通过添加正确的contentType
和dataType
,它对我有用。
$.ajax({
type: "POST",
url: "/api/design/save",
data: JSON.stringify({
id: floorId,
shapes: shapes,
}),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){
console.log(data);
},
error: function(err) {
console.log(err);
}
});
答案 2 :(得分:2)
问题在于,当我们使用application/x-www-form-urlencoded
时,Spring并不将其理解为RequestBody。因此,如果我们想要使用它,我们必须删除@RequestBody
注释。
@RequestMapping(value = "/", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public void createMessage(Message message){
//TODO DO your stuff here
}
答案 3 :(得分:2)
您可以将代码编写为
headers.put("Content-Type", Arrays.asList("application/json"));
代替
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
答案 4 :(得分:2)
您需要一个@NoArgsConstructor才能进行反序列化。如果没有参数构造函数,则Http消息转换器无法将json(其他媒体类型)映射到Java对象。然后返回415
答案 5 :(得分:0)
在application.properties中添加以下行:
logging.file = myapp.log
重启服务器,提出请求。检查myapp.log以查找失败的内容。对我来说,我收到了这个错误:
2018-05-08 07:08:34.404 WARN 348 --- [http-nio-8080-exec-5] .cjMappingJackson2HttpMessageConverter:无法评估类型为[[simple type,class com.atta]的Jackson反序列化。 entity.User]]:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法处理托管/后向引用' defaultReference':后台引用类型(java.util.List)与托管类型不兼容(com .atta.entity.State)
我使用POSTMAN => raw / JSON(application / json)
答案 6 :(得分:-1)
我和杰森有同样的情况。最后只有这个有效 这是关于代码的反应
export function setServices(jsonString) {
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json;charset=UTF-8;");
var raw = jsonString;
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("http://localhost:8080/setservices", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));}
控制器上的代码
@RequestMapping(value = "/setservices", method = RequestMethod.POST,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String createMessage() throws Exception {
//do smthg
return "Ok"; }