Spring:当我的类已经使用RestController注释时,为什么还要使用RequestBody

时间:2016-09-06 07:45:55

标签: java spring rest

我目前正在使用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注释吗?

3 个答案:

答案 0 :(得分:4)

@RestController包含@ResponseBody,因此您不再需要这样做了。

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

要标记要映射到请求正文的参数,您需要注释。

答案 1 :(得分:0)

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

获取请求信息。 POST或PUT用于创建/更新信息 删除以删除信息。

根据documentation你不需要写@ResponseBody

  

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

     

@RestController是一个结合@ResponseBody和@Controller的构造型注释。更重要的是,它为您的Controller提供了更多的意义,并且可能在未来的框架版本中带来额外的语义。

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

答案 2 :(得分:0)

@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,它将插入空值(应使用),因为@RestController是@RestController的一部分,因此无需使用@ResponseBody。