You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Daniel Kulp (JIRA)" <ji...@apache.org> on 2017/03/24 15:39:42 UTC

[jira] [Updated] (CXF-6230) Using ParamConverterProvider to validate @PathParam value.

     [ https://issues.apache.org/jira/browse/CXF-6230?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Daniel Kulp updated CXF-6230:
-----------------------------
    Component/s: JAX-RS

> Using ParamConverterProvider to validate @PathParam value.
> ----------------------------------------------------------
>
>                 Key: CXF-6230
>                 URL: https://issues.apache.org/jira/browse/CXF-6230
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 2.7.12
>            Reporter: Metin KILIC
>
> I am using cxf version 2.7.12 and I have an end-point in my application takes two PathParam parameters. one of the parameter takes Long and the other one takes java.util.UUID. I am running into an issue where validating the UUID. I created a ParameterHandler by implementing ParamConverterProvider
> public class AppParameterHandler implements ParamConverterProvider {
>     @Override
>     public <T> ParamConverter<T> getConverter(final Class<T> rawType, final Type genericType, final Annotation[] annotations) {
>         if (rawType.getName().equals(Long.class.getName())) {
>             return new ParamConverter<T>() {
>                 @Override
>                 public T fromString(String value) {
>                     try {
>                         //
>                     } catch (NumberFormatException e) {
>                         //
>                     }
>                 }
>                 @Override
>                 public String toString(T value) {
>                     if (value == null) {
>                         return null;
>                     }
>                     return value.toString();
>                 }
>             };
>         }
>         else if (rawType.getName().equals(UUID.class.getName())) {
>             return new ParamConverter<T>() {
>                 @Override
>                 public T fromString(String value) {
>                     try {
>                        //
>                     } catch (Exception e) {
>                         //
>                     }
>                 }
>                 @Override
>                 public String toString(T value) {
>                     if (value == null) {
>                         return null;
>                     }
>                     return value.toString();
>                 }
>             };
>         }
>         return null;
>     }
> }
> This code is working fine for Long type (if the param parameter is passed like 123123a123123 , I can handle it and send back the custom message in the response), but It throws an exception for UUID validation. 
> <html>
>     <head>
>         <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
>         <title>Error 500 javax.ws.rs.core.Response.hasEntity()Z</title>
>     </head>
>     <body>
>         <h2>HTTP ERROR 500</h2>
>         <p>Problem accessing /v1/foo/LONG/bar/INVALID_UUID. Reason:
>             <pre>    javax.ws.rs.core.Response.hasEntity()Z</pre>
>         </p>
>         <h3>Caused by:</h3>
>         <pre>java.lang.NoSuchMethodError: javax.ws.rs.core.Response.hasEntity()Z
> 	at org.apache.cxf.jaxrs.utils.ExceptionUtils.convertFaultToResponse(ExceptionUtils.java:67)
> 	at org.apache.cxf.jaxrs.utils.JAXRSUtils.convertFaultToResponse(JAXRSUtils.java:1524)
> 	at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.convertExceptionToResponseIfPossible(JAXRSInInterceptor.java:261)
> So I debugged the cxf code and found out that it is not even creating the parameter handler that I registered. It hits https://github.com/apache/cxf/blob/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java#L394 line and threw NoSuchMethodException and then It calls https://github.com/apache/cxf/blob/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java#L490 to see if it can evaluate valueOf, fromString for UUID since it is not valid UUID evaluateFactoryMethod throws WebApplicationException : https://github.com/apache/cxf/blob/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java#L507
> To my opinion, it should not throw that exception and let my AppParameterHandler handle the case in here https://github.com/apache/cxf/blob/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java#L423.
> I can provide working/not working example as well if it is needed. 
> So I would like these:
> 1- ParamConverterProvider should be used to validate ? if not, what should I use?
> 2- Why cxf does not call ParameterHandler even I registered it for the class type before throwing exception?
> Thanks,
> Metin



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)