我们在将字符串 id 转换为 Brand 对象时遇到类型不匹配错误。我们已经搜索了这个论坛并遵循了几乎所有步骤,但仍然无法解决它。请您看看我们的配置和我们的客户转换服务代码并帮助我们解决此错误。
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="com.latchiya.util.MreachConversionService" />
<bean id="flowMappings" class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<property name="flowRegistry" ref="flowRegistry"/>
<property name="order" value="0" />
</bean>
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
<!-- Executes flows: the entry point into the Spring Web Flow system -->
<webflow:flow-executor id="flowExecutor">
<webflow:flow-execution-listeners>
<webflow:listener ref="securityFlowExecutionListener" />
</webflow:flow-execution-listeners>
</webflow:flow-executor>
<!-- The registry of executable flow definitions -->
<webflow:flow-registry id="flowRegistry"
flow-builder-services="flowBuilderServices">
<webflow:flow-location-pattern value="/WEB-INF/flows/**/*-flow.xml" />
</webflow:flow-registry>
<!-- Plugs in a custom creator for Web Flow views -->
<webflow:flow-builder-services id="flowBuilderServices"
conversion-service="flowConversionService"
view-factory-creator="mvcViewFactoryCreator" />
<bean id="flowConversionService" class="org.springframework.binding.convert.service.DefaultConversionService" >
<constructor-arg ref="conversionService"/>
</bean>
<!-- Configures Web Flow to use Tiles to create views for rendering; Tiles allows for applying consistent layouts to your views -->
<bean id="mvcViewFactoryCreator"
class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator"
p:viewResolvers-ref="viewResolver" />
<!-- Installs a listener to apply Spring Security authorities -->
<bean id="securityFlowExecutionListener"
class="org.springframework.webflow.security.SecurityFlowExecutionListener" />
<bean name="/socialmediacoupon-flow" class="org.springframework.webflow.mvc.servlet.FlowController">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
// 分支类包含品牌属性
public class Branch extends com.latchiya.model.BaseObject implements java.io.Serializable { // 字段
private Brand brand // 其他字段以及 getter 和 setter } //我们的自定义转换器
@Component
final public class MreachConversionService extends org.springframework.context.support.ConversionServiceFactoryBean
{
public MreachConversionService()
{
HashSet s = new HashSet();
s.add(new MreachObjectConverterFactory());
super.setConverters(s);
}
final public class MreachObjectConverterFactory implements ConverterFactory<String,BaseObject>
{
@Override
public <T extends BaseObject> Converter<String, T> getConverter( Class<T> type )
{
return new MreachObjectConverter(type);
}
final public class MreachObjectConverter<T> implements Converter<String, T>
{
private Manager mgr;
Class type;
public void setMgr(Manager mgr)
{
this.mgr = mgr;
}
/**
*
* @param type An instance of Class for the type being converted to
* @param mgr used to perform the lookup.
*/
public MreachObjectConverter( Class<T> type)
{
this.type = type;
}
@Override
public T convert( String id )
{
System.out.println("Brand is : " + type);
System.out.println("Brand id is : " + id);
return (T)mgr.getObject(type, java.lang.Long.valueOf(id));
}
}
}
}
<!-- Our JSP -->
<form:form styleId="branchForm" commandName="branch">
<form:select path="brand" class="validate[required] select_medium" id="brandId" >
<form:option value="${null}" label="SELECT"/>
<form:options items="${brandList}"/>
</form:select>
<input type="submit" id="next" name="_eventId_save" value="Proceed"></input>
</form:form>
// 我们的 Flow.xml
<view-state id="showBusinessAndLocation" view="../flows/common/resellerBranchForm" model="branch">
<transition on="save" to="showCampaignInfo" >
<evaluate expression="campaignService.saveBranch(branch,userManager.getUserByUsername(currentUser.getName()))" result="flowScope.branch"/>
</transition>
</view-state>
// 我们的错误
2013-09-26 13:47:27,359 DEBUG [http-bio-8443-exec-10] view.AbstractMvcView (AbstractMvcView.java:218) - Processing user event 'save'
2013-09-26 13:47:27,359 DEBUG [http-bio-8443-exec-10] view.AbstractMvcView (AbstractMvcView.java:223) - Resolved model com.latchiya.model.Branch@15197119 [branchName='null' addrLine1='null' addrLine2='null' addrLine3='null' city='null' zipcode='null' state='null' country='null' phoneLandline1='null' phoneLandline2='null' phoneFax='null' phoneCell='null' shortCode='null' status='null' emailId='null' contactName='null' createdOn='null' createdBy='null' modifiedOn='null' modifiedBy='null' ]
2013-09-26 13:47:27,359 DEBUG [http-bio-8443-exec-10] view.AbstractMvcView (AbstractMvcView.java:384) - Binding to model
2013-09-26 13:47:27,375 DEBUG [http-bio-8443-exec-10] view.AbstractMvcView (AbstractMvcView.java:513) - Adding default mapping for parameter 'shortCode'
2013-09-26 13:47:27,375 DEBUG [http-bio-8443-exec-10] view.AbstractMvcView (AbstractMvcView.java:513) - Adding default mapping for parameter 'branchId'
2013-09-26 13:47:27,390 DEBUG [http-bio-8443-exec-10] view.AbstractMvcView (AbstractMvcView.java:513) - Adding default mapping for parameter 'execution'
2013-09-26 13:47:27,390 DEBUG [http-bio-8443-exec-10] view.AbstractMvcView (AbstractMvcView.java:513) - Adding default mapping for parameter 'brand'
2013-09-26 13:47:27,390 DEBUG [http-bio-8443-exec-10] impl.DefaultMapper (DefaultMapper.java:60) - Beginning mapping between source [org.springframework.webflow.core.collection.LocalParameterMap] and target [com.latchiya.model.Branch]
2013-09-26 13:47:27,390 DEBUG [http-bio-8443-exec-10] impl.DefaultMapping (DefaultMappingContext.java:147) - Adding mapping result [Success@421dc mapping = parameter:'shortCode' -> shortCode, code = 'success', error = false, originalValue = '', mappedValue = '']
2013-09-26 13:47:27,390 DEBUG [http-bio-8443-exec-10] impl.DefaultMapping (DefaultMappingContext.java:147) - Adding mapping result [Success@1930aa0 mapping = parameter:'branchId' -> branchId, code = 'success', error = false, originalValue = '', mappedValue = '']
2013-09-26 13:47:27,406 DEBUG [http-bio-8443-exec-10] impl.DefaultMapping (DefaultMappingContext.java:147) - Adding mapping result [TargetAccessError@2864cd mapping = parameter:'execution' -> execution, code = 'propertyNotFound', error = true, errorCause = org.springframework.binding.expression.PropertyNotFoundException: Property not found, originalValue = 'e1s1', mappedValue = [null]]
2013-09-26 13:47:27,406 DEBUG [http-bio-8443-exec-10] impl.DefaultMapping (DefaultMappingContext.java:147) - Adding mapping result [TargetAccessError@b98ed9 mapping = parameter:'brand' -> brand, code = 'typeMismatch', error = true, errorCause = org.springframework.binding.expression.ValueCoercionException: Value could not be converted to target class; is a suitable type converter registered?, originalValue = '526', mappedValue = [null]]
2013-09-26 13:47:27,406 DEBUG [http-bio-8443-exec-10] impl.DefaultMapper (DefaultMapper.java:69) - Completing mapping between source [org.springframework.webflow.core.collection.LocalParameterMap] and target [com.latchiya.model.Branch]; total mappings = 4; total errors = 2
2013-09-26 13:47:27,406 DEBUG [http-bio-8443-exec-10] view.AbstractMvcView (AbstractMvcView.java:230) - Model binding resulted in errors; adding error messages to context
2013-09-26 13:47:27,421 DEBUG [http-bio-8443-exec-10] message.DefaultMessageContext (DefaultMessageContext.java:114) - Resolving message using ***[DefaultMessageResolver@307b0e source = 'brand', severity = ERROR, codes = array<String>['branch.brand.typeMismatch', 'brand.typeMismatch', 'com.latchiya.model.Brand.typeMismatch', 'typeMismatch'], args = array<Object>[[MessageBuilder.ResolvableArgument@df0dac arg = 'brand']], defaultText = 'typeMismatch on brand']
2013-09-26 13:47:27,421 DEBUG [http-bio-8443-exec-10] message.DefaultMessageContext (DefaultMessageContext.java:119) - Adding resolved message [Message@1fad846 source = 'brand', severity = ERROR, text = 'typeMismatch on brand']***