【问题标题】:Custom error message containing parameter names when validation fails验证失败时包含参数名称的自定义错误消息
【发布时间】:2018-06-11 16:33:53
【问题描述】:

我希望我的 API 在请求缺少必需参数时返回 errorMessage。例如假设有一个方法:

@GET
@Path("/{foo}")
public Response doSth(@PathParam("foo") String foo, @NotNull @QueryParam("bar") String bar, @NotNull @QueryParam("baz") String baz)

其中@NotNull 来自包javax.validation.constraints。

我写了一个异常映射器,如下所示:

@Provider
public class Mapper extends ExceptionMapper<ConstraintViolationException> {

  @Override
  public Response toResponse(ConstraintViolationException) {
    Iterator<ConstraintViolation<?>> it= exception.getConstraintViolations().iterator();
    StringBuilder sb = new StringBuilder();
    while(it.hasNext()) {
      ConstraintViolation<?> next = it.next();
      sb.append(next.getPropertyPath().toString()).append(" is null");
    }
    // create errorMessage entity and return it with apropriate status
  }

但next.getPropertyPath().toString() 以method_name.arg_no 格式返回字符串,f.e. fooBar.arg1 is null

我想接收输出fooBar.baz is null 或只是baz is null。

我的解决方案是为 javac 包含 -parameters 参数,但无济于事。

也许我可以通过使用过滤器以某种方式实现它:

public class Filter implements ContainerResponseFilter {

@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {

    UriInfo uriInfo = requestContext.getUriInfo();
    UriRoutingContext routingContext = (UriRoutingContext) uriInfo;

    Throwable mappedThrowable = routingContext.getMappedThrowable();

    if (mappedThrowable != null) {
        Method resourceMethod = routingContext.getResourceMethod();
        Parameter[] parameters = resourceMethod.getParameters();

      // somehow transfer these parameters to exceptionMapper (?)
    }
  }
}

上面的思路唯一的问题就是先执行ExeptionMapper,再执行filter。我也不知道我怎么可能在 ExceptionMapper 和 Filter 之间传输 errorMessage。也许还有其他方法?

【问题讨论】:

    标签: java jakarta-ee jaxb jersey


    【解决方案1】:

    您可以将ResourceInfo注入异常映射器以获取资源方法。

    @Provider
    public class Mapper extends ExceptionMapper<ConstraintViolationException> {
    
        @Context
        private ResourceInfo resourceInfo;
    
        @Override
        public Response toResponse(ConstraintViolationException ex) {
            Method resourceMethod = resourceInfo.getResourceMethod();
            Parameter[] parameters = resourceMethod.getParameters();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2014-02-02
      • 2020-07-02
      相关资源
      最近更新 更多