当前位置: 首页 > 知识库问答 >
问题:

在Spring MVC中结合@ModelAttribute和@RequestBody的功能

丘普松
2023-03-14

为了映射请求体,我们可以在参数上使用@RequestBody注释,这将告诉Spring使用RequestResponseBodyMethodProcessor

对于映射请求参数,我们可以使用@ModelAttribute注释(或者避免任何注释;效果相同),这将告诉Spring使用ServletModelAttributeMethodProcessor

但是有没有一个简单的方法把这两者结合起来呢?有没有办法让spring首先用请求参数映射DTO,然后用从主体中的JSON反序列化的数据重写?

共有1个答案

邹嘉致
2023-03-14

结果不是,反正在写作的时候也不是。

RequestMappingHandlerAdapter.GetDefaultArgumentResolvers保留参数resovlers的默认配置,我们有:

  • RequestResponseBodyMethodProcessor处理@RequestBody批注,以及
  • ServletModelAttributeMethodProcessor处理@modelAttribute或不带任何批注的任何参数。
@ControllerAdvice
@RequiredArgsConstructor
@Order(HIGHEST_PRECEDENCE)
public class ServletRequestBinderRequestBodyAdvice extends RequestBodyAdviceAdapter {

    private final ServletRequest servletRequest;

    @Override
    public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        copyDefaultPropertiesThatWhereOverwritenWithNull(parameter, body);

        new ExtendedServletRequestDataBinder(body).bind(servletRequest);

        return body;
    }

    private void copyDefaultPropertiesThatWhereOverwritenWithNull(MethodParameter parameter, Object arg) {
        Object argWithDefaults = instantiateClass(parameter.getParameterType());
        copyPropertiesSkippingNulls(argWithDefaults, arg);
    }

}
 类似资料:
  • 我有: 和: 我不喜欢的是手动将从放入:。 对于正文为的POST请求,如何在中自动设置,以便您获得如下所示的? 基本上,我想要这样的东西: 有没有办法做到这一点? 谢谢你!:) 编辑:这是一个老问题,仍然没有答案,所以我想为这个问题添加新的视角。 我们遇到的另一个问题是验证,即基于某个字段和进行验证的特定定义的自定义约束。 如果我们从请求体中删除,那么我们如何从自定义约束中访问它呢?:)

  • 无论我尝试什么,发送给dispatcher servlet的请求都会返回HTTP 415错误。请求中将内容类型设置为application/json。 消息转换器似乎没有将请求映射到对象。 我的POM中有所有Jackson依赖项: 控制器类: 我试图在@刚需映射中添加接受、消费、生产,但没有成功。 我可以使用HttpServletRequest作为方法参数获得正确的JSON响应: 这一个在写入系统

  • 我有这样基于方面的日志记录: 当我使用RequestBody执行请求时,它工作正常,会触发advice。但是,当我执行没有

  • 有一个Java spring MVC web应用程序,我正在发出一个jquery ajax post请求。我的控制器设置为接收和发送json数据。一切正常,JSON字符串格式良好,控制器可以创建和填充命令对象,并用JSON请求数据的内容填充它。然而,我正在更新联系人对象的数据,我的JSP表单元素只包含DB更新所需的所有数据的子集。在带有表单的JSP页面的初始GET请求中,我从DB中检索所有必要的数

  • 问题内容: 有人可以在Spring 3中解释@RequestBody和@ResponseBody注释吗?他们是干什么的?任何例子都很好。 问题答案: 在文档中有一个名为16.3.3.4的完整章节,其中将请求主体与@RequestBody批注进行映射。还有一个叫做16.3.3.5的映射,它使用@ResponseBody注释映射响应主体。我建议你查阅这些部分。也相关:@RequestBodyjavad

  • 有人能解释一下Spring3中的和注释吗?它们是干什么用的?任何例子都很好。