Код состояния HTTP 500 для NotFoundException - PullRequest
2 голосов
/ 21 декабря 2011

Я разрабатываю приложение с помощью RESTEasy и JBOSS 5.1.

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

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

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

Проблема в том, что в ответе заголовка у меня есть Код состояния: 500 внутренняя ошибка сервера

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

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

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

Ответы [ 4 ]

2 голосов
/ 15 апреля 2012

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

2 голосов
/ 20 января 2012

Кажется немного странным, что RestEASY не обрабатывает NotFoundException из коробки. Следует, в соответствии с документами:

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());


    }
}
1 голос
/ 21 декабря 2011

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

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

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

regards.

0 голосов
/ 23 декабря 2011

Может быть, может помочь пользовательский javax.servlet. Фильтр.

...