我有一个SQL数据库,其中主键是UUID,但UUID的规范字符串表示非常长,我想在我的URL中使用缩短版本(Base58)。 Spring Data的DomainClassConverter
会将MVC请求参数或路径变量转换为域对象,但我希望能够在将已解析的ID传递到存储库之前对其进行修改。
默认SpringDataWebConfiguration
使用上下文提供的DomainClassConverter
创建FormattingConversionService
,这可能是不安全的任意破坏。向方法参数添加注释可能会消除解释的歧义,但这必须在整个地方进行复制,而不能与外部控制器(如Spring Data REST)一起使用。将(String parameter
- > ID)转换委派给转换服务的行为是在私有内部类中硬连接的,因此我无法在那里进行修改。
是否有任何非侵入性的方法来拦截参数并在传递给RepositoryInvoker
之前对其进行转换?
答案 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 - 这是非常有用的信息
最好的