【问题标题】:Handling method validation exceptions处理方法验证异常
【发布时间】:2014-03-20 08:26:36
【问题描述】:

我没有找到问题“如何处理方法验证异常?”的任何答案,该问题由 Bean Validation 1.1 自动抛出。

我有以下环境:

Glassfish 4
hibernate-validator-5.0.1.Final.jar (in ear)

现在我尝试实现方法参数的自动验证:

@Local
@ValidateOnExecution(type = ExecutableType.ALL)
public interface SomeServiceLocal {

     String someMethod(@Size(max = 1) String value);

}

执行中:

@Stateless
public class OtherBean implements OtherBeanLocal {

   @EJB
   private SomeServiceLocal someService;

   @Override
   public String otherMethod() {
      return someService.someMethod("abc");
   }

}

}

现在,当我调用 otherMethod 时:

javax.ejb.EJBTransactionRolledbackException
        at com.sun.ejb.containers.BaseContainer.mapLocal3xException(BaseContainer.java:2279)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2060)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1979)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220)

紧随其后

Caused by: javax.validation.ConstraintViolationException: 1 constraint violation(s) occurred during method validation
...

Constraint violations: 
 (1) Kind: PARAMETER
 parameter index: 3
 message: size must be between 0 and 1

处理违规异常的最佳做法是什么?

【问题讨论】:

  • 我认为这取决于您的用例?例如,如果输入来自用户通过 UI,您可能希望处理 ConstraintViolationException 中包含的 ConstraintViolation 并将信息传递给用户。或者,如果您正在进行批处理,您将记录异常并标记记录以供检查等

标签: ejb-3.1 bean-validation


【解决方案1】:

我创建了处理 EJBException 并提取约束违规的 cdi 拦截器。效果很好:

@MyValidation
@Interceptor
public class MyValidationExceptionInterceptor implements Serializable {

    private static final long serialVersionUID = -5280505156146359055L;

    @AroundInvoke
    public Object processViolationException(InvocationContext ctx) throws Exception {
       try {
          return ctx.proceed();
       } catch (EJBTransactionRolledbackException e) {
          Throwable throwable = e.getCause();
          if (throwable != null && throwable.getCause() != null && throwable.getCause() instanceof ConstraintViolationException) {
             ConstraintViolationException cve = (ConstraintViolationException) throwable.getCause();
             throw new MyException(getMessage(cve));
          }
        throw e;
       } catch (Exception e) {
          throw e;
       }
    }

    private String getMessage(ConstraintViolationException cve) {
       StringBuilder builder = new StringBuilder();
       for(ConstraintViolation<?> violation : cve.getConstraintViolations()) {
           builder.append(violation.getMessage()).append(';');
       }
       return builder.toString();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2019-08-07
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多