2013-06-12 74 views
0

我正在使用CXF的REST服務,它使用int參數執行GET請求。處理REST異常

@Path("parkingservice") 
public interface ParkingService { 

    /** 
    * @param id 
    * @return 
    */ 

    @GET 
    @Path("/parkings/{id}/parkingState") 
    @Produces(MediaType.APPLICATION_JSON) 
    ParkingState getStatus(@PathParam("id") int id); 
} 

我打電話給我的服務是這樣的: http://domain.com:8087/services/rest/parkingservice/parkings/2805/parkingState

當我把一個數字,它的工作原理,但是當我把一個String,我有這樣的例外:

WARNING: javax.ws.rs.NotFoundException: java.lang.NumberFormatException: For input string: "dd" 
    at org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:322) 
    at org.apache.cxf.jaxrs.utils.InjectionUtils.createParameterObject(InjectionUtils.java:845) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromUriParam(JAXRSUtils.java:1041) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.createHttpParameterValue(JAXRSUtils.java:733) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:708) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:655) 
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:238) 
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:99) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271) 
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239) 
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223) 
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:203) 
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137) 
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:243) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:168) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:219) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: java.lang.NumberFormatException: For input string: "dd" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
    at java.lang.Integer.parseInt(Integer.java:449) 
    at java.lang.Integer.valueOf(Integer.java:554) 
    at org.apache.cxf.common.util.PrimitiveUtils.read(PrimitiveUtils.java:60) 
    at org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:310) 
    ... 34 more 

我我喜歡避免有這種例外,無論我給什麼類型..或找到一種方式來處理這種異常與消息,如「請提供一個很好的ID」

非常感謝

+0

什麼是HTTP結果代碼? 400? – 2013-06-12 13:04:01

回答

0

對getStatus方法使用下面的簽名,這可以同時工作。

ParkingState getStatus(@PathParam("id") String id); 
+0

我已經使用了字符串,然後解析爲int.It的作品。問題仍然存在,如果我想捕捉異常,我該怎麼做?在該方法的實施中,它沒有工作..我應該這樣做,但我不知道在哪裏或在什麼水平 – ErEcTuS

+0

檢查此http://cxf.apache.org/docs/jax-rs-basics。 html#JAX-RSBasics-Exceptionhandling,personnaly我使用CXF中的映射器處理異常。您可以根據自己的需要進行自定義。 – ajjain

0

getStatus(@PathParam("id") int id);取整數作爲參數,你試圖傳遞String的不是int,這就是爲什麼它拋出的NumberFormatException異常。 你必須處理它,或者做一個檢查是否傳入的值是int如果不是那麼這樣一條消息「請提供一個有效的輸入」。

+0

我已經用try/catch NumberFormatException實現了我的代碼,但它沒有捕獲它..我不知道我需要在什麼級別捕獲它 – ErEcTuS

+0

你可以發佈你的實現嗎? – subodh

2

將異常映射器添加到您的休息層。代碼是這樣的:

package com.cxf.util; 

import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 


public class CustomExceptionMapper implements 
     ExceptionMapper<NotFoundException> { 

    public CustomExceptionMapper() { 
    } 

    @Override 
    public Response toResponse(NotFoundException arg0) { 
     //your logic and return accordingly 
     return Response.serverError().build(); 
    } 

} 

你,如果你正在使用Spring來維護您的服務豆類和CXF配置然後在jaxrs:providers標籤,其中JAXRS這是添加此映射爲一個bean:xmlns:jaxrs="http://cxf.apache.org/jaxrs"

每當你的應用程序會拋出notfoundexception它會在這個類中。

第二個選擇是,你可以把這個參數作爲字符串,然後解析它在你的try catch塊中。在NumberformatException返回400狀態碼。既然你有一個自定義的POJO作爲返回,你可以從org.apache.cxf.jaxrs.ext.MessageContext中獲取一個HttpServletResponse對象並在其中設置狀態。下面是一個虛擬代碼:

public class RestServiceImpl implements RestService{ 

@Context 
MessageContext context; 

public CustomPojo getData(String id){ 
HttpServletResponse httpResponse = context.getHttpServletResponse(); 
    try{ 

    }catch(NumberFormatException e){ 
    httpResponse.setStatusCode(400); 
    } 
} 
}