我正在使用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?
答案 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可以提供帮助。