Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 域类转换器双转换_Java_Spring_Model View Controller - Fatal编程技术网

Java 域类转换器双转换

Java 域类转换器双转换,java,spring,model-view-controller,Java,Spring,Model View Controller,我试图在我的SpringMVC项目中使用Spring的DomainClassConverter特性。但我的控制器有问题。 问题是我无法将表单的更改值获取到ModelAttribute。 例如:我的数据库中有objectUser{id:1,username:“User”,pass:“111”},当我试图将其修改为表单结束后更改(User{id:1,username:“User_changed”,pass:“222”})到控制器时,我接收到持久用户(无更改) @RequestMapping(meth

我试图在我的SpringMVC项目中使用Spring的DomainClassConverter特性。但我的控制器有问题。 问题是我无法将表单的更改值获取到ModelAttribute。 例如:我的数据库中有object
User{id:1,username:“User”,pass:“111”}
,当我试图将其修改为表单结束后更改(
User{id:1,username:“User_changed”,pass:“222”})
到控制器时,我接收到持久用户(无更改)

@RequestMapping(method=RequestMethod.POST)
公共模型和视图创建(@modeldattribute(“user”)@有效用户,
BindingResult bindingResultUser,
模型和视图模型,
WebRequest WebRequest,
区域设置){…}

经过一段时间的调试,我找到了这种转换器行为的原因

当ModelAttributeMethodProcessor尝试将绑定的用户对象转换为ModelAttribute时,首先从此行开始:返回binder.convertifEssential(binder.getTarget(),parameter.getParameterType(),parameter)

@Override
public final Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
        NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

    String name = ModelFactory.getNameForParameter(parameter);
    Object attribute = (mavContainer.containsAttribute(name) ?
            mavContainer.getModel().get(name) : createAttribute(name, parameter, binderFactory, webRequest));

    WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);
    if (binder.getTarget() != null) {
        bindRequestParameters(binder, webRequest);
        validateIfApplicable(binder, parameter);
        if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {
            throw new BindException(binder.getBindingResult());
        }
    }

    // Add resolved attribute and BindingResult at the end of the model
    Map<String, Object> bindingResultModel = binder.getBindingResult().getModel();
    mavContainer.removeAttributes(bindingResultModel);
    mavContainer.addAllAttributes(bindingResultModel);

    return binder.convertIfNecessary(binder.getTarget(), parameter.getParameterType(), parameter);
}
@覆盖
公共最终对象resolveArgument(MethodParameter参数、ModelAndViewContainer、mavContainer、,
NativeWebRequest webRequest,WebDataBinderFactory binderFactory)引发异常{
字符串名称=ModelFactory.getNameForParameter(参数);
对象属性=(mavContainer.containsAttribute(名称)?
获取(名称):createAttribute(名称、参数、binderFactory、webRequest));
WebDataBinder binder=binderFactory.createBinder(webRequest,属性,名称);
if(binder.getTarget()!=null){
bindRequestParameters(binder、webRequest);
验证是否适用(活页夹、参数);
if(binder.getBindingResult().hasErrors()&&isBindExceptionRequired(binder,参数)){
抛出新的BindException(binder.getBindingResult());
}
}
//在模型末尾添加已解析的属性和BindingResult
Map bindingResultModel=binder.getBindingResult().getModel();
RemoveAttribute(bindingResultModel);
mavContainer.addAllAttribute(bindingResultModel);
返回binder.convertifEssential(binder.getTarget(),parameter.getParameterType(),parameter);
}
然后,DataBinder->调用ConversionService->DomainClassConverter转换用户对象,将其转换为ModelAttribute。 DomainConverter首先转换用户->Id,然后返回用户,此时用户正在从数据库中重新读取,并且丢失了DataBinder所做的所有修改分配

我在替换此行时解决了这个问题~~~if(sourceType.equals(targetType)){~~toif(sourceType.getType()!=null&&sourceType.getType().equals(targetType.getType()){

    @Override
    public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {

        if (source == null || !StringUtils.hasText(source.toString())) {
            return null;
        }

        if (sourceType.equals(targetType)) {
            return source;
        }

        Class<?> domainType = sourceType.getType();

        EntityInformation<Object, ?> entityInformation = repositories.getEntityInformationFor(domainType);

        return conversionService.convert(entityInformation.getId(source), targetType.getType());
    }
@覆盖
公共对象转换(对象源、类型描述符源类型、类型描述符目标类型){
if(source==null | |!StringUtils.hasText(source.toString()){
返回null;
}
if(sourceType.equals(targetType)){
返回源;
}
类domainType=sourceType.getType();
EntityInformation EntityInformation=repositories.getEntityInformationFor(domainType);
返回conversionService.convert(entityInformation.getId(源),targetType.getType());
}
理论上,我们必须比较类型,但类型描述符。或者我错了