Micronaut 无法加载和使用我的“TypeConverter”实现
Micronaut fails to load and use my `TypeConverter` implementation
我有一个接受 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
添加一个构造函数,我可以看到 class 根本不是由 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);
}
}
我有一个接受 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
添加一个构造函数,我可以看到 class 根本不是由 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);
}
}