当我使用angular来发布数据时,我可以在spring控制器中获得null值

时间:2016-04-13 09:52:13

标签: 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");
    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.

3 个答案:

答案 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并没有为您更改页面,在我看来,更好的选择是使用@RestControllerResponseEntity作为您的细粒度控制方法的结果响应如下。

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