[ 
https://issues.apache.org/jira/browse/CXF-5916?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14082081#comment-14082081
 ] 

Enrico Scheider commented on CXF-5916:
--------------------------------------

Hi Sergey,

many thx for answering and resolving immediately...
Truth be told: i had'nt had the new @PeanParam from JAX-RS 2.0 in mind yet - 
maybe a sort of ' forgot about something due to an allday new frameworks with 
massive new feature's hell ;-)' - so thx for this hint as well.

As you said, WadlGenerator doesn't support this yet, so by now it's not a real 
option to use this new jax-rs-spec feature. As far as i understood the new 
@BeanParam's they are - simple said - just an collection and delegation to 
well-known jax-rs 1.0 @*Param-annos. So a starting point to support this might 
be here:

{code:title=WadlGenerator.java|borderStyle=solid}
// cxf 3.0.1, line=663
private void writeParam(StringBuilder sb, Parameter pm, OperationResourceInfo 
ori, boolean isJson) {
        Method method = getMethod(ori);
        Class<?> type = method.getParameterTypes()[pm.getIndex()];
        if (!"".equals(pm.getName())) {
            // write standard jax-rs 1.0 annotated parameter
            doWriteParam(ori,
                         sb,
                         pm, 
                         type, 
                         method.getGenericParameterTypes()[pm.getIndex()], 
                         pm.getName(),
                         method.getParameterAnnotations()[pm.getIndex()], 
                         isJson);
        } else {
            // cxf param bean support here
            List<Class<?>> parentBeanClasses = new LinkedList<Class<?>>();
            parentBeanClasses.add(type);
            doWriteBeanParam(ori, sb, type, pm, null, parentBeanClasses, 
isJson);
        }
    }
{code}
Of course i don't know all the hard inner details of WadlGenerator by now - but 
maybe there is a way to provide all required parameter info's before, 
independent of cxf-param bean, new jax-rs 2.0 @BeanParam or jax-rs-1.0 @*Param. 
So we could always perform the 'doWriteParam' part here (something like: treat 
each method param as jax-rs 1.0 @*Param mimic)?

cheers , Enrico


> WADL contains wrong parameter name for parameter beans
> ------------------------------------------------------
>
>                 Key: CXF-5916
>                 URL: https://issues.apache.org/jira/browse/CXF-5916
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 3.0.0, 3.0.1
>            Reporter: Enrico Scheider
>            Assignee: Sergey Beryozkin
>            Priority: Minor
>             Fix For: 2.7.13, 3.0.2, 3.1.0
>
>
> I'm using auto generated wadl from jax-rs annotated service beans in 
> conjunction with cxf parameter bean extension (cool feature ;-), thx. alot). 
> Wenn accessing the auto generated wadl (url extension ?_wadl) the resulting 
> parameter names are always lower cased and do not reflect e.g. real path 
> variable names when using the parameter bean extension. Assume the following 
> example code (annotated service, sample parameter bean, relevant wadl 
> snippets)...:
> {code:title=MyService.java|borderStyle=solid}
> @Path("sample/{camelCasedVariable}")
> @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
> public class MyService {
>     @GET
>     @Path("test1/{userId}")
>     public Response test1(@PathParam("camelCasedVariable") final String 
> variable, @PathParam("userId") final String id) {
>         return Response.accepted().build();
>     }
>     @GET
>     @Path("test2/{userId}")
>     public Response test2(@PathParam("") final SampleBean bean) {
>         return Response.serverError().build();
>     }
> }
> {code}
> {code:title=SampleBean.java|borderStyle=solid}
> public class SampleBean {
>     private String camelCasedVariable;
>     private String userId;
>     public String getCamelCasedVariable() {
>         return camelCasedVariable;
>     }
>     public void setCamelCasedVariable(final String camelCasedVariable) {
>         this.camelCasedVariable = camelCasedVariable;
>     }
>     public String getUserId() {
>         return userId;
>     }
>     public void setUserId(final String userId) {
>         this.userId = userId;
>     }
> }
> {code}
> ... resulting in the following wadl snippet, shortened:
> {code:xml}
> <!-- intro, grammer,... -->
> <resources base="http://localhost:8080/services/";>
>     <resource path="/sample/{camelCasedVariable}/test1/{userId}>
>         <param name="camelCasedVariable" style="template" type="xs:string">
>         <param name="userId" style="template" type="xs:string">
>     </resource>
>     <resource path="/sample/{camelCasedVariable}/test2/{userId}>
>         <param name="camelcasedvariable" style="template" type="xs:string">
>         <param name="userid" style="template" type="xs:string">
>     </resource>
> </resources>
> {code}
> In test1 standard jax-rs annotations have been used and generated wadl part 
> is ok. In test2 cxf-parameter bean has been used, resulting in lowercased 
> variable names which seems to be incorrect. Same occurs when using parameter 
> beans in QueryParams, probably on other jax-rs variable type as well 
> (Matrix,Form etc.).
> I've checked the WadlGenerator.java class and found the following referenced 
> code snippet from InjectionUtils.java (cxf-rt-frontend), maybe this is a 
> starting hint for your analysis:
> {code:title=InjectionUtils.java|borderStyle=solid}
> //... 
> public static Map<Parameter, Class<?>> getParametersFromBeanClass(Class<?> 
> beanClass, 
>                                                                       
> ParameterType type,
>                                                                       boolean 
> checkIgnorable) {
>     // some stuff to detect public setter methods...
>    // cxf-3.0.0: line1219 | cxf.3.0.1 line 1224
>    String propertyName = methodName.substring(minLen).toLowerCase();
>   // this propertyName is used as Parameter model name later on...
>   params.put(new Parameter(type, propertyName), m.getReturnType());
> {code}
> From my point of view the propertyName should not be lowercased here.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to