Java 当我向用户发送数据时,我可以在spring控制器中获得空值

Java 当我向用户发送数据时,我可以在spring控制器中获得空值,java,angularjs,spring,spring-mvc,Java,Angularjs,Spring,Spring Mvc,我使用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"); al

我使用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";
    }

}
我得到像这样的空用户

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);
});
如果我将
@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.

将数据发布到服务器时,您可能需要在请求头中设置
内容类型:application/json

也可使用:

@RequestMapping(value = "/signup",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_VALUE)
代替:

@RequestMapping(value = "/signup",method = RequestMethod.POST,produces = {MediaType.APPLICATION_JSON_VALUE})
编辑


有时(我不确定什么时候),
MappingJackson2HttpMessageConverter
没有向负责将请求参数转换为模型bean的spring上下文注册。如果未注册,手动注册可以解决问题。

将数据发布到服务器时,可能需要在请求头中设置
内容类型:application/json

也可使用:

@RequestMapping(value = "/signup",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_VALUE)
代替:

@RequestMapping(value = "/signup",method = RequestMethod.POST,produces = {MediaType.APPLICATION_JSON_VALUE})
编辑


有时(我不确定什么时候),
MappingJackson2HttpMessageConverter
没有向负责将请求参数转换为模型bean的spring上下文注册。如果未注册,手动注册可能会解决问题。

首先,在您的模型中,您应该拥有

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

}

我希望这能帮助您

首先,在您的模型中,您应该有

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

}

我希望通过添加
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>

com.fasterxml.jackson.core
杰克逊数据绑定
2.7.3
com.fasterxml.jackson.core
杰克逊核心
2.7.3
com.fasterxml.jackson.core
杰克逊注释
2.7.3
其次,在配置中添加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);
    }
@Bean
公共映射Jackson2HttpMessageConverter jsonConverter(){
MappingJackson2HttpMessageConverter jsonConverter=新的MappingJackson2HttpMessageConverter();
ObjectMapper ObjectMapper=新的ObjectMapper();
setObjectMapper(objectMapper);
返回jsonConverter;
}
@凌驾

public void configuremessageconverter(ListI最终通过添加
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>

com.fasterxml.jackson.core
杰克逊数据绑定
2.7.3
com.fasterxml.jackson.core
杰克逊核心
2.7.3
com.fasterxml.jackson.core
杰克逊注释
2.7.3
其次,在配置中添加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);
    }
@Bean
公共映射Jackson2HttpMessageConverter jsonConverter(){
MappingJackson2HttpMessageConverter jsonConverter=新的MappingJackson2HttpMessageConverter();
ObjectMapper ObjectMapper=新的ObjectMapper();
setObjectMapper(objectMapper);
返回jsonConverter;
}
@凌驾

公共无效配置MessageConverters(Listit是非常奇怪的很多次我用这种方式工作,对我来说可能更多关于错误的细节可以帮助你找到解决方案我用这种方式工作很多次非常奇怪,对我来说可能更多关于错误的细节可以帮助你找到解决方案你能检查一下
内容类型吗>当您发布请求时?内容类型:application/json您可以在发布请求时检查
内容类型是什么吗?内容类型:application/json嗯,我使用了您的代码片段,并在本地环境中运行了它,没有任何问题。我能够获得
用户名
。您得到的响应代码可能会告诉我们一些事情http 415,服务器拒绝了此请求,因为请求实体的格式不受请求方法的请求资源的支持。为
org.springframework.web
打开
DEBUG
级别日志可能会给出确切的原因。让我们来看看。好吧,我使用了您的代码片段,并在本地环境中运行了它没有问题。我可以获取
用户名
。您得到的响应代码可能会说明问题。http 415,服务器拒绝了此请求,因为请求实体的格式不受请求方法的请求资源支持。打开
org.springframework.web
调试
级别日志我可以告诉你确切的原因,让我们来谈谈。