Java Micronaut无法加载和使用我的“TypeConverter”实现
我有一个控制器方法,它接受POJOJava 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
@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
格式。。。所以这是有道理的。。。更新了代码(已剪断)