java - DomainClassConverter double conversion -


i trying use spring's domainclassconverter feature spring mvc project. got problem controllers. problem can not changed values of form modelattribute. example: have object user{id: 1, username: "user", pass: "111"} in database, when try modify form end post changes (user{id: 1, username: "user_changed", pass: "222"}) controller, receive persistent user(without changes)

@requestmapping(method = requestmethod.post) public modelandview create(@modelattribute("user") @valid user user, bindingresult bindingresultuser, modelandview model, webrequest webrequest, locale locale) {...}

after time spent debugging, find reason of such converter behavior.

first starts row when modelattributemethodprocessor try convert bound user object modelattribute: return binder.convertifnecessary(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 , bindingresult @ end of model     map<string, object> bindingresultmodel = binder.getbindingresult().getmodel();     mavcontainer.removeattributes(bindingresultmodel);     mavcontainer.addallattributes(bindingresultmodel);      return binder.convertifnecessary(binder.gettarget(), parameter.getparametertype(), parameter); } 

then, databinder-> invoke conversionservice->domainclassconverter convert user object convert modelattribute. domainconverter first converts user->id, in user, @ moment user re-reading database , lost modified assignments databinder made.

i solve problem when replaced row ~~if (sourcetype.equals(targettype)) {~~ if (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());     } 

in theory have compare types typedescriptors. or wrong?


Comments