2013-06-12 10 views
0

Я использую службу REST с CXF, которая выполняет запрос GET с параметром int.Обработка исключений 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

Когда я поставил номер, он работает, но когда я ставлю строки, у меня есть исключение:

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 

Я d хотел бы избежать этого исключения независимо от того, какой тип я даю ... или найти способ справиться с этим исключением с сообщением типа «просьба предоставить хороший идентификатор»

Большое спасибо

+0

Что такое код результата HTTP? 400? –

ответ

0

Используйте нижнюю подпись для метода getStatus, это будет работать в обоих направлениях.

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

Я использовал String, а затем разобрался с int.It работает. Вопрос остается в том, что, если я хочу поймать исключения, где я могу это сделать? В реализации метода это не сработало. Я должен сделать это раньше, но я не знаю, где и на каком уровне – ErEcTuS

+0

Проверьте этот http://cxf.apache.org/docs/jax-rs-basics. html # JAX-RSBasics-Exceptionhandling, personnaly Я обрабатываю исключения, используя mappers в CXF. Вы можете настроить его в соответствии с вашими потребностями. – ajjain

0

Ваш getStatus(@PathParam("id") int id); принимает целое число в качестве аргумента, и вы пытаетесь передать String вместо междунар, поэтому он бросает исключение 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 является следующее: xmlns:jaxrs="http://cxf.apache.org/jaxrs"

Всякий раз ваше приложение будет бросать notfoundexception, он пойдет в этом классе.

Второй вариант заключается в том, что вы можете принять этот параметр как String, затем проанализировать его в блоке try catch. On NumberformatException возвращает код состояния 400. Поскольку у вас есть пользовательский POJO в качестве возврата, вы можете взять объект HttpServletResponse из org.apache.cxf.jaxrs.ext.MessageContext и установить в нем статус. Ниже приведен фиктивный код:

public class RestServiceImpl implements RestService{ 

@Context 
MessageContext context; 

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

    }catch(NumberFormatException e){ 
    httpResponse.setStatusCode(400); 
    } 
} 
} 
Смежные вопросы