当前位置: 首页 > 面试题库 >

Spring的ConversionService

越开畅
2023-03-14
问题内容

我在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,即可进行转换,而无需您干预。



 类似资料:
  • 服务器应为无状态 不能期望客户端存储Cookie。 发送到服务器的凭据不应为纯文本 我是Spring Security的新手,因此如果我能在实现它时得到任何帮助,我将不胜感激。

  • 问题内容: 我已经设计了一个Spring Boot REST API ADD和GET方法 卡夫卡听众 在服务层中,我需要返回来自的项目列表。 使用Spring kafka进行REST API的最佳方法是什么? 问题答案: 您需要使用a 将结果返回到rest控制器。 参见ReplyingKafkaTemplate。 2.1.3版引入了KafkaTemplate的子类来提供请求/回复语义。该类名为Re

  • 我正在逐步将Spring Boot引入Spring JPA项目。我的意图是首先介绍Spring Boot,而不是在一些后期的Spring数据,但我找不到任何使用Spring Boot JPA而没有Spring数据的示例(也找不到合适的启动器)。 怎么会?在没有Spring数据的情况下,将Spring Boot引入Spring JPA项目有什么好处吗?或者只有在Spring数据到位的情况下才有意义。

  • 我们最近从Spring Cloud Netflix Ribbon迁移到Spring Cloud LoadBalancer,并使用Spring Cloud kubernetes作为发现客户端。 现在spring.cloud.kubernetes.ribbon.mode(https://cloud.spring.io/spring-cloud-static/spring-cloud-kubernete

  • 问题内容: 我正在寻找一个好的安全框架,该框架可以对方法的基于参数的访问规则进行注释。 基本上,我想检查是否允许通过身份验证的用户以特定对象作为参数调用特定方法。 春季安全性可以满足我的需求,但是由于这个原因(春季论坛),如果我无法使其正常工作,我正在寻找替代方法。 要求: 基于配置或注释的方法安全性,我想避免将安全代码放在我的服务方法中 规则基于方法的参数,仅基于角色的安全性是不够的 开箱即用的

  • 我想在我的应用程序中使用LDAP,以便进行身份验证 在前面的配置中,我使用数据库进行身份验证 不,我想使用ldap进行身份验证 我修改了security-app-context.xml 但是当我测试时,我有这样一个错误: LDAP://192.168.0.88:389 基本DN DC=部长,DC=FR 身份验证搜索筛选器 (&(objectclass=person)(mail=@email_add