NotFoundException的HTTP状态代码500

时间:2011-12-21 10:05:50

标签: exception jboss resteasy

我正在使用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 个答案:

答案 0 :(得分: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());


    }
}

答案 1 :(得分:2)

我遇到了一些问题。我找到了根本原因。内置的异常句柄只出现在resteasy最新版本的构建2.3.1 GA中。如果您升级到此版本。您可以获得预期的结果。

答案 2 :(得分:1)

我相信你应该使用:

而不是抛出异常
import javax.ws.rs.core.Response;
return Response.status(404).build();
当你需要返回一个未找到的时候,在你的rest方法中

问候。

答案 3 :(得分:0)

也许自定义的javax.servlet.Filter可以提供帮助。