1

自定义验证器问题不存在 bean 自省。请将@Introspected 添加到类并确保启用 Micronaut 注释处理不工作 Micronaut 2.2.1

@Retention(RetentionPolicy.RUNTIME)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Constraint(validatedBy = { })
public @interface LastProductIdRequired {
    String message() default "Product id is required for pagination if current page is greater then 0";
}

工厂

@Factory
public class LastProductIdRequiredFactory {
    @Singleton
    ConstraintValidator<LastProductIdRequired, PaginationViewModel> lastProductIdRequired() {
        return (value, annotationMetadata, context) ->
                value != null && (value.getCurrentPage() > 0 && value.getLastProductId() != null);
    }
}

POJO

@Introspected
public class PaginationViewModel {
    int pageSize = 10;
    int total = 0;
    int currentPage = 0;
    int totalPage = 0;
    @LastProductIdRequired
    String lastProductId;
    ....
}


@Introspected
public class ProductSearchCriteria extends PaginationViewModel{

}

控制器

@Controller("/product")
@Validated
public class ProductController {
@Get(value = "/{?searchCriteria*}")
public Maybe<FindProductViewModel> find(@Valid ProductSearchCriteria searchCriteria) {
        LOG.info("Controller --> Finding all the products");
        return iProductManager.find(searchCriteria);
    }
}

错误

{
    "message": "searchCriteria: Cannot validate view.model.product.ProductSearchCriteria. No bean introspection present. Please add @Introspected to the class and ensure Micronaut annotation processing is enabled",
    "_links": {
        "self": {
            "href": "/api/v1/product",
            "templated": false
        }
    }
}
4

1 回答 1

0

您可以运行这种方法,并提供ProductSearchCriteria作为参数

private Set<String> getIntrospectedProperties(Class<?> productSearchCriteria) {
final BeanIntrospection<?> introspection =
BeanIntrospection.getIntrospection(productSearchCriteria);
return Arrays.stream(introspection.getPropertyNames()).collect(Collectors.toSet());
}

于 2021-06-18T13:05:37.057 回答