Сейчас я работаю над Grizzly 2.3.16 и Jersey 2.14. Я пытаюсь получить настраиваемое исключение, обработанное сервером и возвращенное клиенту. Вместо этого кажется, что я получаю общие ошибки Grizzly, хотя кажется, что вызывается правильный код.
Это метод фильтрации (часть класса, украшенная «@Provider»).
@Override
public void filter(ContainerRequestContext context) throws IOException
{
throw new MappableException(
new CustomAuthenticationException(
"Custom Error message"));
}
Вот полная реализация ExceptionMapper:
@Provider
public class CustomAuthenticationExceptionMapper
implements ExceptionMapper<CustomAuthenticationException>
{
public Response toResponse(CustomAuthenticationException e)
{
return Response.status(Status.UNAUTHORIZED.getStatusCode()).
header("WWW-Authenticate", "Basic realm=\"Custom\"").
type("text/plain").entity(e.getMessage()).build();
}
}
Вот как я получаю ответ и читаю его:
response = invocationBuilder.method(requestMethod.toString(), Response.class);
System.out.println(response.readEntity(String.class));
Когда я получаю объект, это HTML от Grizzly, а не мое собственное сообщение, как и должно быть.
Вот трассировка стека непосредственно перед вызовом toResponse - я могу проверить, что код вызывается, но похоже, что каким-то образом Джерси или Гризли просто отбрасывают его и в конечном итоге заменяют сообщением гризли по умолчанию.
at org.glassfish.jersey.server.ServerRuntime$Responder.mapException(ServerRuntime.java:528)
at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:409)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1030)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:377)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
at org.glassfish.grizzly.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:147)
at org.glassfish.grizzly.servlet.FilterChainImpl.invokeFilterChain(FilterChainImpl.java:106)
at org.glassfish.grizzly.servlet.ServletHandler.doServletService(ServletHandler.java:221)
at org.glassfish.grizzly.servlet.ServletHandler.service(ServletHandler.java:169)
at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:219)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Unknown Source)
Я не уверен, какие еще части будут уместны, но они могут быть предоставлены по мере необходимости.