2011-12-21 166 views
2

我正在使用RESTEasy和JBOSS 5.1開發應用程序。NotFoundException的HTTP狀態碼500

對於特定情況,我必須返回404錯誤(未找到)。

在來源,我使用

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

的問題是,在頭回應,我有 狀態代碼:500內部服務器錯誤

即使在身體異常是:

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

這是一種正常的行爲?無法返回狀態碼:404?

+0

最後,我認爲這只是一個配置/依賴問題。現在它工作正常(所以,可以拋出NotFoundException)。 – ovi2ut 2012-01-09 08:17:07

回答

2

我遇到一些問題。我找到了根本原因。內置的異常句柄只在最新版本的2.3.1版本中才會出現。如果你升級到這個版本。你可以得到預期的結果。

1

我相信,而不是拋出一個異常,你應該使用:

import javax.ws.rs.core.Response; 
return Response.status(404).build(); 
在你的休息方法

當你需要返回未找到。

關於。

+0

我正在使用已經存在的代碼,我無法修改返回類型(無法返回響應)。我正在使用這個DELETE,但我不能用它來獲取返回類型是另一種類型的對象。 – ovi2ut 2011-12-22 07:22:30

0

也許自定義javax.servlet.Filter可以提供幫助。

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


    } 
}