【问题标题】:Spring : Why should I still use @RequestBody when my class is already annotated with @RestController?Spring:当我的类已经用@RestController 注释时,为什么我还要使用@RequestBody?
【发布时间】:2016-09-06 07:45:54
【问题描述】:

我目前正在将 Java 和 Spring 用于我的 Web 服务应用程序。我正在使用@RestController 注释,希望消除使用@ResponseBody@RequestBody 注释的需要。不幸的是,删除 @RequestBody 注释会使序列化失败。

这是我的代码,它没有将请求正文映射到我没有的方法参数:

@RestController
@RequestMapping(value = "/member", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class MemberController {
    @Autowired
    private MemberService memberService;

    @RequestMapping("/create")
    public void create(Member member) {
        memberService.create(member);
    }

    @RequestMapping("/read")
    public Member read(Member member) {
        return memberService.read(member);
    }

    @RequestMapping("/update")
    public void update(Member member) {
        memberService.update(member);
    }

    @RequestMapping("/delete")
    public void delete(Member member) {
        memberService.delete(member);
    }

    @RequestMapping("/retrieveById")
    public Member retrieveById(Member member) {
        return memberService.retrieveById(member);
    }

    @RequestMapping("/retrieveAll")
    public List<Member> retrieveAll(Member member) {
        return memberService.retrieveAll();
    }
}


当我已经在使用@RestController 时,我真的需要使用@RequestBody 注释吗?

【问题讨论】:

    标签: java spring rest


    【解决方案1】:

    @RestController 包含@ResponseBody,所以你不再需要它了。

    但是你仍然需要@RequestBody注解,因为你为一个POST请求调用的方法可能包含多个参数,其中一个映射到请求体,其他参数的方法可能是PathVariables 或例如UriComponentsBuilder

    并且要标记要映射到请求体的参数,您需要注释。

    【讨论】:

      【解决方案2】:

      更新: 是的,您仍然需要@RequestBody,因为您正在执行 POST。如果你换一个 get 你真的不需要它。当您尝试使用 REST API 时,您应该尝试使用 HTTP 状态代码。

      GET 用于请求信息。 POST 或 PUT 用于创建/更新信息 DELETE 用于删除信息。

      根据documentation,你不需要写@ResponseBody

      为方便起见,您可以使用@RestController 注释控制器类,而不是使用@ResponseBody 注释所有@RequestMapping 方法。

      @RestController 是一个结合了@ResponseBody 和@Controller 的原型注解。不仅如此,它还为您的 Controller 赋予了更多意义,并且还可能在框架的未来版本中携带额外的语义。

      我认为您应该从您的课程中删除 method = RequestMethod.POST 并将其添加到每个方法中。 retrieveAll 方法应该是 GET 而不是 POST。

      【讨论】:

        【解决方案3】:
        @RestController
        @RequestMapping("/test")
        public class TestController {
        
            private static final Logger logger = LoggerFactory.getLogger(TestController.class);
        
            @PostMapping(path = "/insert", consumes = "application/json", produces = "application/json")
            
            public void insertMethod(@RequestBody TestEntity t) {
                testService.insertData(t);
            }
        

        如果您不添加@RequestBody,它将插入空值(应该使用),无需使用@ResponseBody,因为它是@RestController 的一部分。

        【讨论】:

        • 需要@RequestBody 将post请求数据映射到方法参数
        猜你喜欢
        • 2022-01-16
        • 1970-01-01
        • 2017-10-03
        • 2016-05-03
        • 1970-01-01
        • 2015-02-15
        • 1970-01-01
        • 2020-07-27
        • 1970-01-01
        相关资源
        最近更新 更多