Я бы хотел, чтобы мой 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
, например fooBar.arg1 is null
Я хотел бы получить вывод fooBar.baz is null
или просто baz is null
.
Мое решение заключалось в том, чтобы включить параметр -parameters
для javac, но безрезультатно.
Вероятно, я мог бы как-то добиться этого с помощью фильтров:
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, затем выполняется фильтр.Также я понятия не имею, как я могу передать errorMessage между ExceptionMapper и Filter.Может есть другой способ?