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

Java 如何在SpringMVC中将字符串转换为现有实例?,java,spring,jsp,model-view-controller,propertyeditor,Java,Spring,Jsp,Model View Controller,Propertyeditor,以下是场景: 控制员准备可用品牌的列表(积存库、数据库)列表 此列表将作为ModelMap属性查看 使用表单查看列表:选择 <form:select path="branding"> <form:option value="-" label="--Please Select"/> <form:options items="${brandingList}" itemValue="id" itemLabel="name"/>

以下是场景:

  • 控制员准备可用品牌的列表(积存库、数据库)<代码>列表
  • 此列表将作为ModelMap属性查看
  • 使用
    表单查看列表:选择

      <form:select path="branding">
            <form:option value="-" label="--Please Select"/>
            <form:options items="${brandingList}" itemValue="id" itemLabel="name"/>
      </form:select>
    
    但若我希望它能够访问某个按id加载对象的服务,我希望Spring基于某个注释创建实例(我会在这个编辑器中放置一些@Autowired字段)。这样好吗?什么样的注释最适合它?期待一些建议


  • 我现在找到了可行的解决办法

    我只是在编辑器类中创建新的PortalBranding,设置它的id。这样门户就有了id存在的品牌。其余部分通过持久性(Hibernate)完成


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

    您需要的是Spring的
    转换服务。以下是参考资料:

    只需执行与此类似的
    转换器

    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;
        }
    }
    
    公共类StringToPortalBrandingConverter实现转换器{
    @注入//或@Autowire
    SomeService SomeService;//您需要的某些服务或其他依赖项。
    @凌驾
    公共PortalBranding转换(字符串源){
    //在此处执行从“源”到“PortalBranding”的转换。
    //你也可以利用你注入的“someService”。
    ...
    返回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>
    
    
    

    这就是它的全部。

    所以我想Spring会在启动时创建这个转换器的实例吗?感谢您的回答,对于这个场景,我可以继续使用我的解决方案,但将来会记住您的解决方案:)。不用担心,这肯定是您的特权,但请记住,您选择使用的方法会产生一个对象,而该对象实际上并不代表您要使用的对象的状态。您只需将id更改为包含该id的空对象……而使用
    转换器
    ,您可以一次性正确填充整个对象。此外,一旦您知道如何使用
    转换器
    ,您也可以转到
    格式化程序
    ,开始充分利用核心转换。(请参阅)我完全理解使用转换器的优点和使用我的转换器的缺点,但在这种情况下,我不需要整个对象。就像我说的,我很感谢你的回答,我会标记它,因为我可能会在其他情况下使用它。
    <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>