2015-01-20 2 views
0

В настоящее время я работаю в Grizzly 2.3.16 и Jersey 2.14. Я пытаюсь получить настраиваемое исключение, обрабатываемое сервером и возвращенному клиенту. Вместо этого кажется, что я получаю общие ошибки Grizzly, хотя правильный код, кажется, называется.Почему мой ExceptionMapper выбрасывается в Джерси/Гризли?

Это метод фильтра (часть класса, который имеет украшение @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, как против моего пользовательского сообщения, как и должно быть.

Вот трассировка стека только до того, как вызывается запрос на вызов - я могу проверить, что код вызывается, но похоже, что каким-то образом Джерси или Гризли просто отбрасывают его и в конечном итоге заменяют сообщение по умолчанию grizzly.

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) 

Я не уверен, что другие части будут актуальны, но они могут быть предоставлены по мере необходимости.

+0

Вы можете использовать PLS. создать тестовый файл (на github?), чтобы воспроизвести проблему? – alexey

+0

вы бросаете MappableException, в то время как ваш ExceptionMapper обрабатывает исключение CustomAuthenticationException - это, вероятно, причина (если CustomAuthenticationException не является подтипом MappableException) –

ответ

1

Мне нужно было добавить джерси-гризли-connector.jar от maven.