Spring MVC中是否有任何方式在填充请求参数值之前重置模型中的值



我们正在从支撑杆1.3框架移动到弹簧MVC。在Struts框架中,我们使用了类型ActionForm的形式。我们将其维护在会议范围内。当我们浏览屏幕(A-> B-> C(时,我们将重置表单的某些属性。如果我们从屏幕A到B导航,我们将传递param X = 1,并且在表单的属性'x'中填充了相同的内容。但是在从b到c导航之前,我们重置x = null,因为屏幕b不会传递param x,并且我们不希望x维护从屏幕上收集的值。在支撑杆中,在填充参数之前每次自动调用复位方法。无论如何我们是否可以在Spring MVC中实现类似的实现?

 protected void processPopulate(HttpServletRequest request,
        HttpServletResponse response, ActionForm form, ActionMapping mapping)
        throws ServletException {
        if (form == null) {
            return;
        }
        // Populate the bean properties of this ActionForm instance
        if (log.isDebugEnabled()) {
            log.debug(" Populating bean properties from this request");
        }
        form.setServlet(this.servlet);
        form.reset(mapping, request);
        if (mapping.getMultipartClass() != null) {
            request.setAttribute(Globals.MULTIPART_KEY,
                mapping.getMultipartClass());
        }
        RequestUtils.populate(form, mapping.getPrefix(), mapping.getSuffix(),
            request);

终于,我找到了在模型中调用我自己的重置方法的选项,然后才能使用请求值填充。我扩展了ServletModeLattributeMethodProcessor和Overriden的方法BindRequestParameters,我在模型上称为RESET方法,然后在超级类中将方法路由到方法。再过来,我在RequestMappingHandlerAdapter中注册了我的实现类,为参数解析器之一。我首先收集了所有解析器,然后首先添加了我的,以避免跳过现有的解析器进行模型处理。

public class ResetArgumentResolver extends ServletModelAttributeMethodProcessor {
    @Autowired
    RequestMappingHandlerAdapter requestMappingHandlerAdapter;
    ResetArgumentResolver(boolean annotationNotRequired) {
        super(annotationNotRequired);
    }
    ResetArgumentResolver(){
        this(false);
    }
    @PostConstruct
    public void afterPropertiesSet() {
        List<HandlerMethodArgumentResolver> argumentResolvers = requestMappingHandlerAdapter.getArgumentResolvers();
        List<HandlerMethodArgumentResolver> newArgResolvers = new ArrayList<>();
        newArgResolvers.add(this);
        newArgResolvers.addAll(argumentResolvers);
        requestMappingHandlerAdapter.setArgumentResolvers(Collections.unmodifiableList(newArgResolvers));
    }
    @Override
    protected void bindRequestParameters(WebDataBinder binder, NativeWebRequest request) {
        Object attribute = binder.getTarget();
        if (xxxx.class.isAssignableFrom(attribute.getClass())) {
            ((xxxx) attribute).reset();
        }
        super.bindRequestParameters(binder,request);
    }
}

最新更新