【问题标题】:Validating a lambda request in Micronaut using ConstraintValidator使用 ConstraintValidator 在 Micronaut 中验证 lambda 请求
【发布时间】:2021-03-11 14:01:43
【问题描述】:

我有一个像这样的处理程序和一个自定义注释@ValidRequest:

@Introspected
public class MessageHandler extends MicronautRequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {

  @Override
  public APIGatewayProxyResponseEvent execute(@ValidRequest APIGatewayProxyRequestEvent event) {
    return new APIGatewayProxyResponseEvent()
        .withStatusCode(200)
        .withHeaders(Collections.singletonMap("Content-Type", "application/json"))
        .withBody("OK");
  }

}

注解本身如下所示:

@Retention(RUNTIME)
@Constraint(validatedBy = {ValidRequestValidator.class})
public @interface ValidRequest {

  String message() default "Request is not valid";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};

}

而验证器是这样的:

@Introspected
public class ValidRequestValidator implements ConstraintValidator<ValidRequest, APIGatewayProxyRequestEvent> {

  @Override
  public boolean isValid(
      @Nullable APIGatewayProxyRequestEvent event,
      @NonNull AnnotationValue<ValidRequest> annotationMetadata,
      @NonNull ConstraintValidatorContext context
  ) {
    if (event == null || event.getBody() == null || event.getBody().isEmpty()) {
      throw new RuntimeException("Incorrect request event");
    }
    return true;
  }

}

问题是验证被完全忽略了。我可以发送任何带有或不带有正文的事件,并且一切正常。我按照 Micronout 文档做了所有事情,可能有什么问题?

https://docs.micronaut.io/latest/guide/index.html#beanValidation

【问题讨论】:

  • 你能去掉 throw new RuntimeException 并改为返回 false 并尝试
  • @SusanMustafa 同样的行为,我需要在我的逻辑中抛出异常

标签: java validation lambda bean-validation micronaut


【解决方案1】:

请从您的验证器中删除 @Introspect 并尝试按照我在下面所做的相同操作。

@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces(MediaType.APPLICATION_JSON)
@Path("/somePath")
public Response workingWithSubscription( @Valid UpdateSubscription updateSubscription) {

@ValidUpdateSubscription
public class UpdateSubscription implements UpdateSubscriptionRequest {

}

@Target({TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = UpdateSubscriptionValidator.class)
@Documented
public @interface ValidUpdateSubscription {

    int ERROR_CODE = 1111;

    String message() default "Null value";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    int errorCode() default ERROR_CODE;

    Response.Status status() default Response.Status.BAD_REQUEST;
}

@Named
@ApplicationScoped
public class UpdateSubscriptionValidator implements ConstraintValidator<ValidUpdateSubscription, UpdateSubscription> {

    @Override
    public boolean isValid(UpdateSubscription value, ConstraintValidatorContext context) {

        return true/OR/false;
    }
}

【讨论】:

  • 非常感谢,但如果我按照您的建议操作(包装扩展请求并添加注释),则会收到以下错误。如果我添加 Introspected,则验证将再次停止工作。 javax.validation.ConstraintViolationException:process.event:无法验证 com.example.APIRequest。不存在 bean 自省。请将@Introspected 添加到类并确保启用 Micronaut 注释处理
  • 我忘了给验证器添加@Named注解,现在可以了!非常感谢!
猜你喜欢
  • 2019-10-16
  • 2023-03-27
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2021-09-16
相关资源
最近更新 更多