【问题标题】:I get null value in spring controller when I user angular to post data当我使用角度发布数据时,我在弹簧控制器中得到空值
【发布时间】:2016-08-04 07:58:25
【问题描述】:

我使用 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.

【问题讨论】:

  • 您可以在发布请求时查看Content-Type 是什么吗?
  • 内容类型:应用程序/json

标签: java angularjs spring spring-mvc


【解决方案1】:

当您将数据发布到服务器时,您可能需要在请求标头中设置Content-Type: 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 上下文。如果未注册,手动注册可能会解决问题。

【讨论】:

  • 好吧,我使用了你的代码 sn-p 并在我的本地环境中运行它,没有任何问题。我能够得到username。您得到的响应代码可能会说明问题。
  • http 415,服务器拒绝了这个请求,因为请求实体的格式不被请求的方法所请求的资源支持。
  • org.springframework.web 开启DEBUG 级别日志可能会给你确切的原因。
【解决方案2】:

首先在你的模型中你应该有

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

}

希望对你有帮助

【讨论】:

  • 这很奇怪,很多时候我都以这种方式工作,对我来说,有关错误的更多细节可能有助于帮助您找到解决方案
【解决方案3】:

我终于通过添加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);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多