当前位置: 首页 > 知识库问答 >
问题:

在Micronaut中使用ConstraintValidator验证lambda请求

戚奇略
2023-03-14

我有一个这样的处理程序和一个自定义注释@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

共有1个答案

巫马正卿
2023-03-14

请从验证器中删除@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;
    }
}
 类似资料:
  • 我有一个简单的Micronaut Lambda应用程序,很难成功地将Mocks注入到我的单元测试中。 build.gradle 具有以下基本控制器 以及以下测试类别: 上面的测试将失败,因为模拟从未与之交互。 调试时,我可以看到在测试类本身中被模拟,但在类中使用了一个实际的对象。 我注意到,当我不使用(例如)时,这是预期的,所以我认为这与Lambda运行时有关,我希望有人能够指出我在正确的方向上。

  • 我需要在爪哇中使用摇摆不定(YAML文件)来验证传入的REST请求。所以任何人都可以帮我这个。提前致谢。

  • Spring靴2.0.3。发布,javax。验证2.0.1。最后一个选项被使用。 我需要验证进入控制器的请求: 这叫做服务: 将对象保存到MongoRepository方法

  • 我有一个“AllowedValuesValidator.java”类: 以及相应的接口类: 我希望能够编写一个单元测试类来测试验证器中的直接逻辑。但我在谷歌上搜索的大多数地方似乎都给出了测试类的例子,我们基本上测试了给定模型类的所有验证器,例如: 我不想构建模拟模型来测试所有验证器。有没有一种方法可以创建一个单独的测试类,只在一个验证器中直接测试逻辑,而不使用任何其他模型类等?

  • 我们有一个无服务器后端,它由API网关中的IAM保护。我们有另一个内部身份验证解决方案,我们希望在我们的服务中支持这两种身份验证机制。我计划编写一个自定义授权程序,带有支持多重身份验证的身份验证链。 但是,我找不到任何方法在后端验证AWS Sigv4签名。我发现AWS文档关于如何签署请求或计算Sigv4签名([1],[2],[3]和[4]),但是所有这些文档都是从客户端的角度来看的,客户端将可以访

  • 我正在使用GRPC Java,希望使用拦截器验证请求。 许多这样的链接告诉我们使用onMessage()访问请求的方法,但我想知道他们在做什么来验证请求。 此外,onMessage()中的消息参数是通用的,我不能直接访问请求字段参数,但必须使用一些if-else/switch case键入消息,然后分别对每个字段应用检查,这是我现在的最后一个选项。 例如,下面是一个示例原型文件: 另外,我简单地打