当前位置: 首页 > 知识库问答 >
问题:

未在spring boot中注册自定义转换器

东门航
2023-03-14

我是新来的Spring Boot。在我的控制器中,我使用UUIDs作为@PathVariable。缺省情况下,在传递无效的UUID时,Spring返回MultiodArgumentTypeMismatchExc0019

当客户端传递一个无效的UUID时,我想抛出一个自定义的InvalidUUIDException,这样我就可以使用这个异常返回一个自定义的错误。

我试图注册一个定制的UUIDConverter(实现org.springframework.core.convert.converter.converter)。

@Component
public class UUIDConverter implements Converter<String, UUID>
{
    private static final Pattern pattern = Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}");

    @Override
    public UUID convert(String input) throws InvalidUuidException
    {
        if (!pattern.matcher(input).matches()) {
            throw new InvalidUuidException(input);
        }

        return UUID.fromString(input);
    }
}

为了注册这个组件,我将这个转换器添加到springsConversionService。使用转换服务工厂bean

@Configuration
public class ConversionServiceConfiguration
{
    @Bean
    public ConversionServiceFactoryBean conversionService()
    {
        ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
        bean.setConverters(getConverters());

        return bean;
    }

    private Set<Converter> getConverters()
    {
        Set<Converter> converters = new HashSet<>();
        converters.add(new UUIDConverter());

        return converters;
    }
}

我还尝试使用@Component而不是这里提到的@Configuration:Spring没有使用mongo定制转换器

我尝试过的其他解决方案是:命名bean转换ServiceFactoryBean而不是转换服务。或者调用bean.afterProperties tiesSet()并使用bean.getObject()重新调整ConversionService...

我还尝试从WebMVCConfigureAdapter扩展,覆盖addFormatters,并使用addConverter将我的转换器添加到那里。。。

正如这里提到的:如何在spring boot中注册自定义转换器?我还尝试将转换器直接注册为@Bean

无论我尝试了什么,都不会应用UUIDConverter

在spring boot中执行类似操作的正确解决方案是什么<有人能帮忙吗?我做错了什么?

共有1个答案

罗金林
2023-03-14

我只知道这个问题,因为我自己在另一个类中也做了同样的事情,并且花了数小时调试。。。

UUIDConverter是一个已经由Spring本身注册的bean。从字面上选择任何其他名称,您应该会看到它出现。

 类似资料:
  • 所以很明显,添加类型转换器还有其他方式,我通过显式配置转换服务来搞砸了?有没有一种方法可以注册自定义类型转换器而不踩到其他转换器?

  • 为什么它不能与和Java配置一起工作?为什么它与一起使用?

  • 我是新来的Laravel。我有两种不同的用户类型:老师和学生。教师在网站注册表格中注册账户,但学生注册由windows应用程序提供。所以我必须为这个应用程序提供一个API。默认Laravel认证是足够的教师注册,但我可以使用相同的AuthController API注册?我不需要视图或重定向到网站。

  • 我已经为log4j2编写了一个自定义触发策略,该策略将被回滚。在每小时/天/你的工作时间间隔结束时,按照本SO帖子的建议记录文件。 虽然我遵循基于时间的触发策略约定(命名等),但我无法看到我的策略被实例化和使用。 解决方案由3个java文件和一个maven文件组成,可在github上获得 在这里,您可以从政策本身找到主要内容: log4j2。xml文件: 编辑: 在调试过程中,我了解到在log4j

  • 我最近将一个项目从Spring Boot1.5.1升级到2.0.0,但是我们的自定义执行器endpoint没有注册。我尝试了以下endpoint迁移指南(docs.spring.io、github和spring.io),以使用新方法迁移我们的自定义endpoint,但它不起作用。 下面是我正在尝试注册的简化endpoint: 我甚至尝试从类中删除并将其注册为主类中的bean,如下所示: 当我构建项