Java Micronaut无法加载和使用我的“TypeConverter”实现

Java Micronaut无法加载和使用我的“TypeConverter”实现,java,micronaut,micronaut-client,Java,Micronaut,Micronaut Client,我有一个控制器方法,它接受POJO @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Dto { private LocalDate endDate; private String token; private TransactionType type; } 事务类型是一个简单的enum,但我想使用从入站值到事务类型的自定义转换 @Slf4j @Controller(&q

我有一个控制器方法,它接受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
@控制器(“/api/事务”)
公共类IssuerTransactionController{
@Get(value=“/{?tr*}”,products=APPLICATION\u JSON)
公共列表获取(Dto tr){
返回新的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();
    }
}
@Slf4j
@独生子女
公共类TransactionTypeConverter实现TypeConverter{
@凌驾
公共可选转换(字符串值、类targetType、ConversionContext上下文){
返回Arrays.stream(TransactionType.values())
.filter(txnType->StringUtils.equals(txnType.getTransactionType(),value)| | StringUtils.equals(txnType.name(),value))
.findFirst();
}
}
Micronaut未使用类型转换器转换入站值?
为了让Micronaut知道它应该使用转换器,是否需要一些特殊的注册过程

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


如果我将其作为常规依赖项添加到控制器中,它将被加载(这并不奇怪),但仍然没有使用。是否缺少一个步骤?

似乎您正在使用从多个查询值绑定的
功能,该功能在后台只是创建您传入的查询参数的映射,并使用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);
    }
}
公共枚举事务类型{
A(“A”),
B(“B”);
私有最终字符串transactionType;
TransactionType(字符串TransactionType){
this.transactionType=transactionType;
}
公共字符串getTransactionType(){
返回事务类型;
}
@JsonCreator
公共静态事务类型forValue(集合值){
if(values==null | | values.isEmpty()){
返回null;
}
字符串值=值。获取(0);
返回Arrays.stream(TransactionType.values())
.filter(txnType->StringUtils.equals(txnType.getTransactionType(),value)| | StringUtils.equals(txnType.name(),value))
.findFirst().orElse(null);
}
}

您似乎正在使用来自多个查询值的
绑定
功能,该功能只是创建您传入的查询参数的映射,并使用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);
    }
}
公共枚举事务类型{
A(“A”),
B(“B”);
私有最终字符串transactionType;
TransactionType(字符串TransactionType){
this.transactionType=transactionType;
}
公共字符串getTransactionType(){
返回事务类型;
}
@JsonCreator
公共静态事务类型forValue(集合值){
if(values==null | | values.isEmpty()){
返回null;
}
字符串值=值。获取(0);
返回Arrays.stream(TransactionType.values())
.filter(txnType->StringUtils.equals(txnType.getTransactionType(),value)| | StringUtils.equals(txnType.name(),value))
.findFirst().orElse(null);
}
}

虽然有趣的是,上面的方法没有被调用,但您需要使用
对象值
,然后进行一些检查和平衡,因为传入的对象实际上是一个包含该值的
数组列表
,我假设是因为查询参数可以有多个值。在我的例子中只有一个。@Jim是的,你是对的,参数存储为
Map
格式。。。所以这是有道理的。。。更新了截取的代码)虽然有趣的是,上面的方法没有被调用,但是您需要使用
对象值
,然后进行一些检查和平衡,因为传入的对象实际上是一个包含该值的
ArrayList
,我假设是因为查询参数可以有多个值。在我的例子中只有一个。@Jim是的,你是对的,参数存储为
Map
格式。。。所以这是有道理的。。。更新了代码(已剪断)