gpt4 book ai didi

java - Spring中的转换服务

转载 作者:IT老高 更新时间:2023-10-28 13:47:08 27 4
gpt4 key购买 nike

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

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

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

所以我尝试使用转换器,但我没有找到类似的例子,我有点卡住了。我编写了如下代码: 在初始化 Binder 中,我注册了转换服务。因此,在填充 User 对象上的值之前,调用 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,就像您一样,只需将其保留为可以 Autowiring 的东西。 Spring 和 factorybean 定义将负责其余的工作。

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

关于java - Spring中的转换服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347284/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com