Spring的ConversionService

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

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

我问了另一个问题,在填充请求的参数之前准备对象的最佳方法是什么?答案是最好的方法是使用转换服务,而不是使用@ModelAtribute批注方法或使用initBinder中的编辑器进行转换。

因此,我尝试使用转换器,但没有找到类似的示例,但我有些困惑。我编写了如下代码:在初始化绑定程序中,我注册了转换服务。因此,在填充用户对象上的值之前,将调用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进行字符串和用户对象之间的转换。但是,这是Converter实现的一部分。您想要做的是:

  1. 写一个转换器
  2. 向ConversionService注册该转换器
  3. 利用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,即可进行转换,而无需您干预。

以上是 Spring的ConversionService 的全部内容, 来源链接: utcz.com/qa/416084.html

回到顶部