如何在Spring MVC中将字符串转换为现有实例?

时间:2013-11-14 12:57:40

标签: java spring jsp model-view-controller propertyeditor

以下是该方案:

  1. Controller preperes可用品牌列表(CrudRepository,Database)。 List<PortalBranding>
  2. 此列表转到View as ModelMap属性。
  3. 使用form:select

    查看列表
      <form:select path="branding">
            <form:option value="-" label="--Please Select"/>
            <form:options items="${brandingList}" itemValue="id" itemLabel="name"/>
      </form:select>
    
  4. 选中后,默认情况下会尝试将值作为String发送,我想将其转换为PortalBranding对象。所以我添加了@InitBinder方法,我可以注册我的自定义编辑器:

    public class PortalBrandingEditor extends PropertyEditorSupport { ... }
    

    但是如果我希望它能够访问一些通过id加载对象的服务,我希望Spring根据一些注释创建实例(我会在这个编辑器中放置一些@Autowired字段)。那是好方法吗?什么语音最适合它?期待一些建议。

2 个答案:

答案 0 :(得分:0)

我现在找到了工作解决方案。

我只是在Editor类中创建新的PortalBranding,设置它的id。所以门户网站的品牌标识存在。其余的由Persistance(Hibernate)完成。

但仍期待其他解决方案:)。

答案 1 :(得分:0)

你需要的是Spring的ConversionService。以下是参考:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert

只需实现与此类似的Converter

public class StringToPortalBrandingConverter implements Converter<String, PortalBranding> {

    @Inject // or @Autowire
    SomeService someService; // Some service or other dependency you need.

    @Override
    public PortalBranding convert(String source) {
        // Do your conversion from 'source' to 'PortalBranding' here.
        // You can make use of your injected 'someService' as well.
        ...
        return portalBranding;
    }
}

然后,您只需告诉Spring您的自定义转换器:

<mvc:annotation-driven conversion-service="conversionService"/>

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="yourpackage.StringToPortalBrandingConverter"/>
        </set>
    </property>
</bean>

这就是它的全部内容。