【问题标题】:How to use the @RequestBody annotation in Spring MVC inheritanceSpring MVC继承中如​​何使用@RequestBody注解
【发布时间】:2018-10-27 01:48:28
【问题描述】:

首先看下面的代码

public interface DemoInterface {
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    String test(@RequestParam String message);

}

然后我让一个类用注解实现这个接口

@Controller
public class DemoClass implements DemoInterface{
    @Override
    public String test(String message) {
        /** TODO something useing the message **/
    }
}

这没问题,我可以通过http://ip:port/test?message=something访问我的测试方法。

但是当我需要传递一个类而不是一个字符串时:

public interface DemoInterface {
    @RequestMapping(value = "/test", method = RequestMethod.POST,  consumes = "application/json")
    String test(@RequestBody User user);
}

public class User{
    private String name;
    /** some other fileds、 geters and seters **/
}

@Controller
publci class DemoClass implements DemoInterface{
    @Override
    public String test(User user) {
        /** TODO something useing the user's fileds **/
    }
}

此时虽然可以访问http://ip:port/test,但是当我在谷歌Chrome浏览器的Restlet Client中将请求体设置为json时,在测试方法中获取不到用户值,名称始终为空。我的json是这样的:

{"name":"Vincent Kang"}

这是因为我无法在我继承的方法中获得形式参数的注释吗?因为我发现即使在后一种情况下,使用http://ip:port/test?name=Kanghouchao,我仍然可以在测试方法中获取名称, RequestBody 似乎无效。

【问题讨论】:

    标签: java spring-mvc spring-boot request


    【解决方案1】:

    也许我应该在子类的字段中添加@RequestBody

    @Controller
    publci class DemoClass implements DemoInterface{
        @Override
        public String test(@RequestBody User user) {
            /** TODO something useing the user's fileds **/
        }
    } 
    

    现在好了

    【讨论】:

    • 这是一个已知问题,已在 Spring Framework 5.1 中修复,很快将在 Spring Boot 2.1 中修复。通过修复,您不再需要在子类上重复注释。
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 2018-12-14
    • 1970-01-01
    • 2012-12-18
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多