NotFoundException的HTTP状态代码500
我正在用RESTEasy和JBoss5.1开发一个应用程序 对于特定情况,我必须返回404错误(未找到) 在源代码中,我使用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
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)。