微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Micronaut 无法加载和使用我的 `TypeConverter` 实现

如何解决Micronaut 无法加载和使用我的 `TypeConverter` 实现

我有一个控制器方法,它接收一个 POJO。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

public class Dto {    
    private LocalDate endDate;
    private String token;
    private TransactionType type;   
}

交易类型是一个简单的 enum,但我想使用从入站值到交易类型的自定义转换。

@Slf4j
@Controller("/api/transactions")
public class IssuerTransactionController {
    @Get(value = "/{?tr*}",produces = APPLICATION_JSON)
    public List<String> get(Dto tr) {
        return new ArrayList<>();
    }
}

我写了一个转换器:

@Slf4j
@Singleton
public class TransactionTypeConverter implements TypeConverter<String,TransactionType> {
    @Override
    public Optional<TransactionType> convert(String value,Class<TransactionType> targettype,ConversionContext context) {
        return Arrays.stream(TransactionType.values())
                .filter(txnType -> StringUtils.equals(txnType.getTransactionType(),value) || StringUtils.equals(txnType.name(),value))
                .findFirst();
    }
}

Micronaut 不是使用类型转换器来转换入站值吗?
是否需要一些特殊的注册过程才能让 Micronaut 知道它应该使用转换器?

如果我向 TransactionTypeConverter 添加一个构造函数,我可以看到该类实际上根本不是由 Micronaut 创建的。

如果我将它作为常规依赖项添加到控制器中,它会被加载(这并不奇怪),但仍未使用。有没有我遗漏的步骤?

解决方法

似乎您正在使用 Binding from Multiple Query values 功能,该功能在幕后只是创建您传入的查询参数的映射,并使用 Jackson 将映射转换为您自己的 POJO。所以它不依赖于系统转换器,而只依赖于 Jackson 本身。 您可以做的只是使用 Jacksons @JsonCreator 注释来自定义对话。

这样的事情应该可以工作。

public enum TransactionType {
    A ("A"),B ("B");

    private final String transactionType;

    TransactionType(String transactionType){
        this.transactionType = transactionType;
    }

    public String getTransactionType() {
        return transactionType;
    }

    @JsonCreator
    public static TransactionType forValue(Collection<String> values) {           
        if(values == null || values.isEmpty()){
            return null;
        }
        String value = values.get(0);
        return Arrays.stream(TransactionType.values())
            .filter(txnType -> StringUtils.equals(txnType.getTransactionType(),value) || StringUtils.equals(txnType.name(),value))
            .findFirst().orElse(null);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。