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

如何在调用和检查参数之前拦截方法?

乐正玺
2023-03-14

如何拦截调用前的方法并检查参数?

我添加了自定义注释Dto、DtoFiels,并将其写在RestController和方法CreateEntity上。如何检查对象注释DtoFiels中注释的所有字段。我尝试添加BeanPostProcessor并使用InvocationHandler使用proxy.newProxyInstance调用,但它引发了由处理程序执行引起的ExceptionHandlerExceptionResolver解析的异常:org.springframework.transaction.TransactionSystemException:不能提交JPA事务;嵌套异常是javax.persistence.rollbackException:提交事务时出错

我尝试用我的注释添加ConstraintValidator,并注释@Valide,但它用注释@NotNull和@CreatedDate检查所有字段。

方法

 @PostMapping @Dto
 public CompletableFuture<Response> createEntity(@RequestBody Entity entity) {

类实体:

@Column(nullable = false)
protected String name;

protected String description;

@Column(nullable = false, updatable = false)
@CreatedDate
protected LocalDateTime creationDate;

@NotNull
protected boolean deleted;

@NotNull
@LastModifiedDate
protected LocalDateTime modificationDate;

共有1个答案

柴声
2023-03-14

您可以使用验证组来定义哪些约束应该被验证,哪些约束不应该被验证。我假设在调用createEntity时,您不希望强制执行@Notnull和其他验证。相反,您希望执行一些其他自定义验证代码...

在类级约束中定义验证。

@Data
public class Person {

    @NotEmpty
    @Size(min = 10)
    @Pattern(regexp = "[0-9]*")
    private String name;
}

自定义类级约束

@Target({ ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { PersonValidator.class })
@Documented
public @interface ValidPerson {

    String message() default "Invalid person";

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

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

}
public class PersonValidator implements ConstraintValidator<ValidPerson, Person> {
    @Override
    public boolean isValid(Person person, ConstraintValidatorContext context) {
        // Add your validation code here
        if (person == null) {
            return true;
        }
        return person.getName() != null;
    }
}
public interface CustomPersonGroup {

}

@Service
@Validated
public class SomeService {

    public void test(@Validated(value = CustomPersonGroup.class) @ValidPerson Person person) {

    }
}
@Data
public class Person {

    @NotEmpty(groups = CustomPersonGroup.class)
    @Size(min = 10)
    @Pattern(regexp = "[0-9]*")
    private String name;
}
 类似资料:
  • 问题内容: 我有这个代码 有什么方法可以在没有子类化或修改类且没有工厂的情况下拦截呼叫? 编辑:抱歉忘了提到这是在Android平台上。 问题答案: 您是否考虑过面向方面的编程,甚至还考虑过AspectJ?有关AspectJ / Android的信息,请参见此处和此处。

  • 问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器

  • 我想截取在一个类的所有实例上调用的每个setter方法,然后在另一个类对象上调用一个方法,参数对应于第一个类的每个实例的一些字段值。为此,我想使用ByteBuddy API,但我也想为指定类的所有实例只创建一个子类 例如,我编写了以下代码: 我将为每个资源类型创建的每个子类保存在映射中,以便为每个资源类型只创建一个子类。这里的问题是,对于创建的子类的所有实例,传递给在目标对象上调用的方法“upda

  • 问题内容: 我正在用python实现RESTful Web服务,并想通过拦截函数调用并记录其执行时间等方式来添加一些QOS记录功能。 基本上,我想到了所有其他服务都可以从中继承的类,该类会自动覆盖默认方法的实现,并将其包装在logger函数中。实现此目标的最佳方法是什么? 问题答案: 像这样吗 这暗示着在您的方法中添加装饰器(如果您愿意,也可以基于此创建一个显式装饰器): 当您现在尝试类似的方法:

  • 问题内容: 我正在使用Mockito测试旧版JAAS / LDAP登录模块。 该接口定义了以下功能: 我期望包含一个,这是需要进行操作才能通过测试的对象。 有没有一种方法可以有效地对此进行模拟,或者我可以通过实施存根实现更好呢? 问题答案: 对于返回的函数,请使用doAnswer() 和执行拦截必须在作为参数,例如,作为一个匿名类: 在这种情况下将是数组!

  • 我正在使用AeyJ拦截一个名为的方法。为此,我使用了我自己指定的(标记)注释。这就是类的样子: 截取截取注释的方面: 然而,我的方面是基于带注释的参数进行拦截。但我希望方面能够拦截参数t包含的特定值的方法请求。 例如,如果t==“t1”,则必须截取该方法,否则不能截取。 我想知道是否可以在AeyJ(与Spring AOP结合使用)中做到这一点。

  • 问题内容: 主题行基本上说明了一切。我有一个静态方法要拦截,以便可以将周围的建议应用于该方法。我可以使它与任何非静态方法一起使用,但是我不确定如何允许静态方法被拦截。 问题答案: 使用Spring AOP不能做到这一点,因为它是基于代理的。您必须使用AspectJ。看一个简单的例子:http : //blog.jayway.com/2007/02/16/static-mock-using- asp

  • 我正在尝试使用来做同样的事情,现在我使用哪个注释来捕获相关的对象,切入点表达式应该是什么?我尝试了,但这是一个void方法,如何捕获该方法的参数?我是AOP的初学者,所以如果这个问题太琐碎,请原谅。 解决方案:使用spring AOP获取方法参数?