Saya memiliki metode pengontrol, yang menggunakan POJO.

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

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

Jenis transaksi adalah enum sederhana, tetapi saya ingin menggunakan konversi khusus dari nilai masuk ke jenis transaksi.

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

Saya telah menulis konverter:

@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 tidak menggunakan konverter tipe untuk mengubah nilai masuk?
Apakah diperlukan proses pendaftaran khusus agar Micronaut mengetahui bahwa ia harus menggunakan konverter?

Jika saya menambahkan konstruktor ke TransactionTypeConverter, saya dapat melihat bahwa kelas tidak pernah benar-benar dibuat oleh Micronaut sama sekali.

Jika saya menambahkannya sebagai ketergantungan reguler ke pengontrol, itu dimuat (tidak mengherankan di sana), tetapi masih belum digunakan. Apakah ada langkah yang saya lewatkan?

0
Jim 10 Mei 2021, 15:06

1 menjawab

Jawaban Terbaik

Sepertinya Anda menggunakan fungsionalitas Binding from Multiple Query values yang di bawah tenda hanya membuat peta parameter kueri yang Anda berikan dan menggunakan Jackson untuk mengonversi peta menjadi POJO Anda sendiri. Jadi tidak bergantung pada konverter sistem tetapi hanya pada Jackson itu sendiri. Yang dapat Anda lakukan hanyalah menggunakan anotasi @JsonCreator Jacksons untuk menyesuaikan percakapan.

Sesuatu seperti ini harus bekerja.

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);
    }
}
2
Babl 11 Mei 2021, 07:20