我在Spring应用程序中遵循此方案。

  • 请求与对象的ID以及要在此对象中填充的其他一些参数一起发送到服务器
  • 具有此id的对象是从数据库
  • 中加载的
    在此对象中调用
  • getter和setter来填充
  • 然后存储对象

  • 我在this other question中问,在填充请求的参数之前准备对象的最佳方法是什么?答案是最好的方法是使用conversion service而不是在@ModelAtribute带注释的方法中或在initBinder中使用编辑器来执行。

    因此,我尝试使用转换器,但没有找到类似的示例,但我有些困惑。我已经编写了如下代码:在初始化绑定(bind)程序中,我注册了转换服务。因此,在填充用户对象上的值之前,将调用convert()方法从数据库中加载对象。问题在于该配置不起作用,因为它会将对象用户的ID(用户名字段)转换为对象用户,但是随后尝试使用该对象创建setUsername(),因此我得到了“java.lang .IllegalArgumentException:参数类型不匹配”。

    谁能给我一个提示或使用ConversionService获得所需行为的方式的示例?

    谢谢。
    @Autowired
    private ConversionService conversionService;
    
    @InitBinder("user")
    public void initBinder(@RequestParam("username")String username, WebDataBinder binder){
        binder.setConversionService(conversionService);
    }
    
    @RequestMapping(value="/user/save", method=RequestMethod.POST)
    public String save(@ModelAttribute("user") User user, Model model) {
        ...
    }
    

    与类似:
    @Component
    public class UserConversionService implements ConversionService{
        ...
        @Override
        public Object convert(Object name, TypeDescriptor arg1, TypeDescriptor arg2) {
            return userService.find((String)name);
        }
    }
    

    最佳答案

    您正在尝试实现ConversionService以在Strings和User对象之间进行转换。但是,这部分是Converter实现。您想要做的是:

  • 写一个转换器
  • 向ConversionService注册该转换器
  • 利用ConversionService。

  • 您的转换器将类似于:
    final class UserConverter implements Converter<String, User> {
        ...
        public User convert(String username) {
            return userService.find(username);
        }
    
    }
    

    然后,您需要注册该转换器。您可以编写自己的ConversionServiceFactoryBean或覆盖默认值:
    <bean id="conversionService"
          class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="example.UserConverter"/>
            </list>
        </property>
    </bean>
    

    如果您想像以前一样显式地使用ConversionService,请将其保留为可以自动连接的东西。 Spring和该factorybean定义将处理其余的工作。

    但是,如果您已在上下文中使用<mvc:annotation-driven>标记,则可以使用其conversion-service属性引用您的ConversionServiceFactoryBean。然后,您根本不需要在类中包含InitBinder或ConversionService:只需将@RequestMapping的参数作为目标类型User,即可进行转换,而无需您干预。

    08-07 00:05