0

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

默认情况下使用上下文提供的 aSpringDataWebConfiguration创建一个,这可能是不安全的任意破坏。向方法参数添加注释可能会消除解释的歧义,但这都必须在整个地方复制,并且不能与 Spring Data REST 等外部控制器一起使用。将 (->ID) 转换委托给转换服务的行为在私有内部类中是硬连线的,所以我不能在那里修改它。DomainClassConverterFormattingConversionServiceString parameter

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

4

1 回答 1

1

最简单的是如果您创建自己的格式化程序

喜欢:

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 - 它的信息量很大

最好的

于 2016-02-01T10:50:24.160 回答