Spring Boot中能否通过多个@RequestBody传递多个对象?
在Spring Boot中使用多个@RequestBody传递对象的问题
首先明确:不能直接在一个方法里使用多个@RequestBody注解。
原因很简单:HTTP请求的请求体(Body)在一个请求里只有一份,Spring的@RequestBody注解作用是把整个请求体内容绑定到对应参数上。如果给方法加两个@RequestBody参数,Spring无法将同一个请求体同时解析成两个不同对象,运行时会直接抛出异常。
那怎么传递多个对象?最常用也最规范的做法是编写一个包装类,把需要的两个对象整合进去:
先定义包装类:
public class SecretKeyStoreRequest { private KeyStoreRequest keyStoreRequest; private SecretKeyDTO secretKeyDTO; // 生成getter、setter方法,或使用Lombok的@Data注解简化 }
再修改接口方法:
public void storeSecretKey(@RequestBody final SecretKeyStoreRequest request) throws CertificateException, IOException, NoSuchAlgorithmException, KeyStoreException, NoSuchProviderException { // 从包装类中取出两个对象使用 KeyStoreRequest keyStoreRequest = request.getKeyStoreRequest(); SecretKeyDTO secretKeyDTO = request.getSecretKeyDTO(); // 后续业务逻辑处理 }
当然也有一些替代方案,但都不如包装类规范:
- 把其中一个对象的字段拆成
@RequestParam参数传递,但若对象字段较多会非常繁琐,也不符合RESTful风格。 - 让前端将其中一个对象转为JSON字符串,用
@RequestParam接收后手动解析成对象,这种做法可读性差,也容易引发解析错误。
综合来看,编写包装类是最清晰、最符合Spring和REST设计风格的解决方案。
内容的提问来源于stack exchange,提问作者Sinnedkid
相关产品推荐
相关产品推荐

