我使用Angularjs将数据发布到spring控制器。
像这样。var user ={
"userID" : "1",
"username" : "hello",
"password" : "123456"
};
console.log(user);
var response = $http.post("/login/signup",user);
response.success(function (data) {
alert("success");
alert(data);
});
response.error(function (data) {
alert("error");
alert(data);
});
我的模特
public class User {
private long userID;
private String username;
private String password;
public User(){
}
public User(long userID, String username, String password) {
this.userID = userID;
this.username = username;
this.password = password;
}
public long getUserID() {
return userID;
}
public void setUserID(long userID) {
this.userID = userID;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
和我的控制器。
@Controller
@RequestMapping(value = "/login")
public class LoginController {
@RequestMapping(value = "/signup",method = RequestMethod.POST)
public String signUp(User user){
String username = user.getUsername();// NULL!!
System.out.println(username);
return "login";
}
}
我得到这样的空用户。
如果我将@RequestBody
添加到我的控制器中。我甚至无法进入控制器并获得异常。
@RequestMapping(value = "/signup",method = RequestMethod.POST,produces = {MediaType.APPLICATION_JSON_VALUE})
public String signUp(@RequestBody User user){
String username = user.getUsername();
System.out.println(username);
return "login";
}
例外
The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.
答案 0 :(得分:1)
将数据发布到服务器时,可能需要在请求标头中设置Content-Type: application/json
。
也可以使用:
@RequestMapping(value = "/signup",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_VALUE)
Insted of:
@RequestMapping(value = "/signup",method = RequestMethod.POST,produces = {MediaType.APPLICATION_JSON_VALUE})
修改强>
有时候(我不确定何时),MappingJackson2HttpMessageConverter
没有注册spring context,后者负责将请求参数转换为模型bean。如果未注册,手动注册可能会解决问题。
答案 1 :(得分:1)
首先,你的模特应该有
public class User {
private long id;
private String username;
private String password;
...
}
而不是
public class User {
private long userID;
private String username;
private String password;
...
}
因为你发布了像这样的json
{
"id" : "1",
"username" : "hello",
"password" : "123456"
}
而不是
{
"userID" : "1",
"username" : "hello",
"password" : "123456"
}
然后在你的控制器中应该有
@Controller
@RequestMapping(value = "/login")
public class LoginController {
@RequestMapping(value = "/signup",method = RequestMethod.POST,consumes = {MediaType.APPLICATION_JSON_VALUE})
public String signUp(@RequestBoby User user){
String username = user.getUsername();
System.out.println(username);
return "login";
}
}
请记住,在这种情况下,Spring并没有为您更改页面,在我看来,更好的选择是使用@RestController
和ResponseEntity
作为您的细粒度控制方法的结果响应如下。
@RestController
@RequestMapping(value = "/login")
public class LoginController {
@RequestMapping(value = "/signup",method = RequestMethod.POST,consumes = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity signUp(@RequestBoby User user){
String username = user.getUsername();
System.out.println(username);
return ResponseEntity.ok().build();
}
}
我希望这可以帮到你
答案 2 :(得分:1)
我最后通过添加MappingJackson2HttpMessageConverter
bean来解决这个问题。
首先在pom.xml中添加依赖项
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.3</version>
</dependency>
第二,在配置中添加Bean定义。
@Bean
public MappingJackson2HttpMessageConverter jsonConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
jsonConverter.setObjectMapper(objectMapper);
return jsonConverter;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(jsonConverter());
super.configureMessageConverters(converters);
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON);
}