2011-11-03 49 views
13

我正在JAX-RS上的Web服務上工作。現在我正在尋找捕獲一些異常的方式,以便向用戶發送一條40X的錯誤消息。如何在JAX-RS異常中使用自定義消息設置40X錯誤?

我有一個Web服務和一個ExceptionMapper。

這是我的web服務:

@Path(value = "/test/") 
public interface ServiceTest { 

    @Path(value = "{rrf}") 
    @GET 
    @Produces(MediaType.TEXT_XML) 
    public ObjectDTO getDealer(@PathParam("rrf") String rrf){ 
     ObjectDTO objectDTO = new ObjectDTO(); 
     if(verifyRRFSintax(rrf)) { 
      //Get the objet, this part works fine 
     } else { 
      throw new IllegalArgumentException("Custom message"); 
     } 
     return dwsDTO; 
    } 

    private boolean verifyRRFSintax(String rrf) { 
     return rrf.matches("[0-9]{8}"); 
    } 
} 

這是我ExceptionMapper

@Provider 
@Produces(MediaType.TEXT_XML) 
public class IllegalArgumentExceptionMapper 
    implements ExceptionMapper<IllegalArgumentException> { 

    @Override 
    public Response toResponse(IllegalArgumentException e) { 
     return Response.status(Response.Status.BAD_REQUEST).build(); 
    } 
} 

,這是它如何臨時用戶在應用 - context.xml文件

<bean id="serviceTest" class="ServiceTest"/> 

<jaxrs:server id="Server" address="/ws"> 
    <jaxrs:serviceBeans> 
     <ref bean="serviceTest"/> 
    </jaxrs:serviceBeans> 
    <jaxrs:providers> 
     <bean id="rffErrorException" class="IllegalArgumentExceptionMapper"/> 
    </jaxrs:providers> 
</jaxrs:server> 

當我調試,IllegalArgumentExceptionMapper捕獲我拋出的異常,但我看不到黃色的消息瀏覽器上顯示的網頁。我總是有一個

Erreur d'analyse XML : aucun élément trouvé/XML Parsing Error: no element found (in english)

我如何使瀏覽器顯示此自定義消息? 爲什麼即使我改變回應狀態的種類(NOT_FOUND,BAD_REQUEST,FORBIDDEN),這個黃頁總是一樣的?

PD:在控制檯上,我在消息「out.handlemessage」中顯示Mapper捕獲異常時打印的消息。

謝謝。

+0

玉傢伙,謝謝,我終於找到了我所需要的:我添加了一個自定義異常,如: 公共類DwsWebServiceException擴展WebApplicationException { 公共DwsWebServiceException(字符串消息,詮釋狀態){ 超(響應。狀態(狀態).entity(消息).TYPE(MediaType.TEXT_XML).build()); } } 它顯示消息。 – jomaora

回答

13
throw new WebApplicationException(Response.status(Status.NOT_FOUND)// Or another Status 
       .entity("Error Message").build()); 
+2

我不知道其他的JAX-RS實現,但對於我來說,使用RestEasy 3.0x,這是行不通的。它靜靜地失敗,客戶沒有收到任何迴應。您需要在'Response'構建器的方法鏈中添加'.type(MediaType.TEXT_PLAIN)',否則它似乎會扼殺String「entity」。 – Lambart

+0

謝謝,@Lambart,我發現這要感謝您的評論:https://stackoverflow.com/questions/23628897/dropwizard-exception-handling-giving-custom-error-json-error-messages-to-clie –

+0

@FerranMaylinch高興得到協助。我看到我自己曾經提出過這個問題和答案。 :) – Lambart