2011-12-21 3 views
2

Я разрабатываю приложение с RESTEasy и JBOSS 5.1.Код статуса HTTP 500 для NotFoundException

Для конкретных ситуаций я должен вернуть ошибку 404 (не найден).

В источниках, я использую

import org.jboss.resteasy.spi.NotFoundException; 
throw new NotFoundException(...); 

Проблема заключается в том, что в ответ на заголовок, я Status Code: 500 Внутренняя ошибка сервера

даже если в теле исключения is:

org.jboss.resteasy.spi.UnhandledException: org.jboss.resteasy.spi.NotFoundException 

Это нормальное поведение? Невозможно вернуть код состояния: 404?

+0

Наконец, я думаю, что это была проблема конфигурации/зависимостей. Теперь он работает нормально (так что можно бросить NotFoundException). – ovi2ut

ответ

2

я сталкиваюсь некоторые проблемы. Я нашел причину. Встроенный обработчик исключений встречается только в новой версии resteasy build 2.3.1 GA. Если вы переходите на эту версию. Вы можете получить ожидаемый результат.

1

Я считаю, что вместо того, чтобы выбросить исключение, вы должны использовать:

import javax.ws.rs.core.Response; 
return Response.status(404).build(); 

в вашем методе отдыха, когда вам нужно возвращать не найден.

Отношения.

+0

Я использую уже существующий код, я не могу изменить тип возврата (не могу вернуть ответ). Я использую это для DELETE, но я не могу использовать его для GET, где тип возврата - это другой тип объекта. – ovi2ut

0

Возможно, пользовательский javax.servlet.Filter может помочь.

2

Кажется немного странным, что RestEASY не обрабатывает NotFoundException из коробки. Он должен, according to the docs:

Resteasy имеет набор встроенных исключений, которые выбрасываются на него, когда он сталкивается с ошибками в процессе диспетчеризации или сортировочных.

В любом случае, вы можете обойти это путем добавления ExceptionMapper:

import org.jboss.resteasy.core.Dispatcher; 
import org.jboss.resteasy.mock.MockDispatcherFactory; 
import org.jboss.resteasy.mock.MockHttpRequest; 
import org.jboss.resteasy.mock.MockHttpResponse; 
import org.jboss.resteasy.spi.NotFoundException; 
import org.junit.Assert; 
import org.junit.Test; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 

public class ExceptionTest { 

    @Path("/") 
    public static class Service { 
     @GET 
     public String notFound() throws NotFoundException { 
      throw new NotFoundException(""); 
     } 
    } 

    public static class FailureExceptionMapper implements ExceptionMapper<NotFoundException> { 

     @Override 
     public Response toResponse(NotFoundException exception) { 
      return Response.status(exception.getErrorCode()).build(); 
     } 
    } 

    @Test 
    public void test() throws Exception { 
     Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); 
     dispatcher.getProviderFactory().addExceptionMapper(new FailureExceptionMapper()); 
     dispatcher.getRegistry().addSingletonResource(new Service()); 


     MockHttpRequest request = MockHttpRequest.get("/"); 
     MockHttpResponse response = new MockHttpResponse(); 

     dispatcher.invoke(request, response); 

     Assert.assertEquals(404, response.getStatus()); 


    } 
} 
Смежные вопросы