NotFoundException的HTTP状态代码500

NotFoundException的HTTP状态代码500,exception,jboss,resteasy,Exception,Jboss,Resteasy,我正在用RESTEasy和JBoss5.1开发一个应用程序 对于特定情况,我必须返回404错误(未找到) 在源代码中,我使用 import org.jboss.resteasy.spi.NotFoundException; throw new NotFoundException(...); 问题是,在标题响应中,我有 状态代码:500内部服务器错误 即使在正文中,例外情况是: org.jboss.resteasy.spi.UnhandledException: org.jboss.restea

我正在用RESTEasy和JBoss5.1开发一个应用程序

对于特定情况,我必须返回404错误(未找到)

在源代码中,我使用

import org.jboss.resteasy.spi.NotFoundException;
throw new NotFoundException(...);
问题是,在标题响应中,我有 状态代码:500内部服务器错误

即使在正文中,例外情况是:

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

这是正常的行为吗?无法返回状态代码:404?

我认为您应该使用以下命令,而不是引发异常:

import javax.ws.rs.core.Response;
return Response.status(404).build();
在您的rest方法中,当您需要返回一个“未找到”时


问候。

也许定制的javax.servlet.Filter会有所帮助。

RestEASY没有现成地处理
NotFoundException
,这似乎有点奇怪。应该,

Resteasy有一组内置的异常,当它在分派或编组过程中遇到错误时会抛出这些异常

无论如何,您可以通过添加一个
异常apper
来解决此问题:

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


    }
}
import org.jboss.resteasy.core.Dispatcher;
导入org.jboss.resteasy.mock.MockDispatcherFactory;
导入org.jboss.resteasy.mock.MockHttpRequest;
导入org.jboss.resteasy.mock.MockHttpResponse;
导入org.jboss.resteasy.spi.NotFoundException;
导入org.junit.Assert;
导入org.junit.Test;
导入javax.ws.rs.GET;
导入javax.ws.rs.Path;
导入javax.ws.rs.core.Response;
导入javax.ws.rs.ext.ExceptionMapper;
公共类例外测试{
@路径(“/”)
公共静态类服务{
@得到
公共字符串notFound()引发NotFoundException{
抛出新的NotFoundException(“”);
}
}
公共静态类FailureExceptionMapper实现ExceptionMapper{
@凌驾
公共响应(NotFoundException){
返回Response.status(exception.getErrorCode()).build();
}
}
@试验
public void test()引发异常{
Dispatcher=MockDispatcherFactory.createDispatcher();
dispatcher.getProviderFactory().addExceptionMapper(新FailureExceptionMapper());
dispatcher.getRegistry().addSingletonResource(新服务());
MockHttpRequest请求=MockHttpRequest.get(“/”);
MockHttpResponse response=新的MockHttpResponse();
调用(请求、响应);
Assert.assertEquals(404,response.getStatus());
}
}

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

我使用的是现有代码,无法修改返回类型(无法返回响应)。我用它来删除,但我不能用它来获取返回类型是另一种类型的对象。现在它工作正常(因此,可以抛出NotFoundException)。