如何在DomainClassConverter中使用自定义ID转换?

时间:2015-11-01 03:52:57

标签: java spring type-conversion spring-data spring-data-commons

我有一个SQL数据库,其中主键是UUID,但UUID的规范字符串表示非常长,我想在我的URL中使用缩短版本(Base58)。 Spring Data的DomainClassConverter会将MVC请求参数或路径变量转换为域对象,但我希望能够在将已解析的ID传递到存储库之前对其进行修改。

默认SpringDataWebConfiguration使用上下文提供的DomainClassConverter创建FormattingConversionService,这可能是不安全的任意破坏。向方法参数添加注释可能会消除解释的歧义,但这必须在整个地方进行复制,而不能与外部控制器(如Spring Data REST)一起使用。将(String parameter - > ID)转换委派给转换服务的行为是在私有内部类中硬连接的,因此我无法在那里进行修改。

是否有任何非侵入性的方法来拦截参数并在传递给RepositoryInvoker之前对其进行转换?

1 个答案:

答案 0 :(得分:1)

最简单的方法是创建自己的Formatter

像:

public class UserFormatter implements Formatter<User> {

    @Autowired
    UserRepository userRepository;

    @Override
    public User parse(String text, Locale locale) throws ParseException {
        return userRepository.findOneByUsername(text);
    }

    @Override
    public String print(User user, Locale locale) {
        return user.getUsername();
    }
}

然后在您的应用程序上下文中注册它:

@Configuration
@EnableSpringDataWebSupport
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(userFormatter());
    }
    @Bean
    public UserFormatter userFormatter() {
        return new UserFormatter();
    }
}

@EnableSpringDataWebSupport用于将大量bean带入上下文,请参阅其javadoc - 这是非常有用的信息

最好的