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
Post a Comment