You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Christian Balzer <ch...@gmail.com> on 2015/10/16 12:32:06 UTC

Using two javax @BeanParam beans in the same method signature results in InternalServerErrorException

Hello all,

We are using Spring and Apache CXF.

For the following example code, I get an exception. Which makes me
wonder: can I use two BeanParam annotations/beans in the same method
signature?

import javax.ws.rs.BeanParam;
//...
@GET
@Produces({"application/json;charset=UTF-8"})
public Response doFoo(
        @BeanParam Bar bar,
        @BeanParam Bas bas,
        @Context UriInfo uriInfo)
        throws BazException {

Here is the stack trace:

javax.ws.rs.InternalServerErrorException: null
at org.apache.cxf.jaxrs.utils.SpecExceptions.toInternalServerErrorException(SpecExceptions.java:77)
~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
at org.apache.cxf.jaxrs.utils.ExceptionUtils.toInternalServerErrorException(ExceptionUtils.java:110)
~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
at org.apache.cxf.jaxrs.utils.JAXRSUtils.createBeanParamValue(JAXRSUtils.java:975)
~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:767)
~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:716)
~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:265)
[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:101)
[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]

In JAXRSUtils, I can see this:

BeanParamInfo bmi = ProviderFactory.getInstance(m).getBeanParamInfo(clazz);
if (bmi == null) {
    // we could've started introspecting now but the fact no bean info
    // is available indicates that the one created at start up has been
    // lost and hence it is 500
    LOG.warning("Bean parameter info is not available");
    throw ExceptionUtils.toInternalServerErrorException(null, null);
}

Which is the exception that gets thrown.

Is there any hint in this on what I'm doing wrong? Things seem to work
when I comment out the "@BeanParam Bas bas," line... Am I maybe not
allowed to use two @BeanParam in the same method signature? (I
couldn't find any hint that I wouldn't be, though...)

Kind regards,

Christian
P.S.: This is a cross-post from StackOverflow:
http://stackoverflow.com/q/33168074/2018047

Re: Using two javax @BeanParam beans in the same method signature results in InternalServerErrorException

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi Christian

The test uses a proxy-based API, so
the initial address is set here:
BookStore store = JAXRSClientFactory.create("http://localhost:" + PORT, 
BookStore.class);

and then when a call is made, BookStore class and method are 
introspected and the final request URI is built


Would you be comfortable with creating a basic Maven test project so 
that I can run it ?
Cheers, Sergey


On 23/10/15 15:04, Christian Balzer wrote:
> Hi Sergey,
>
> Sorry it took a little longer to reply. So, I did try with CXF
> 2.7.18-SNAPSHOT today, but had the same results.
> CXF 3.1.3 failed to compile, as maven is reporting a convergence
> error, so I couldn't test that. (I'm not too surprised; I was told by
> colleagues we couldn't move to version 3 just yet.)
>
> I'm not quite sure what you mean by prototyping, but I suspect you'd
> like to see what the beans look like?
> They are each standalone public classes, with private fields and
> public getters - some of which hold logic.
> What I noticed is that a signature like doFoo(@BeanParam Bar bar,
> @MatrixParam("p2") p2, ...) works, while doFoo(@BeanParam Bar bar1,
> @BeanParam Bar bar2, ...) fails. So I'm tempted to rule out the beans
> themselves as the cause to the issue...
>
> Anyway, this is what the beans roughly look like:
>
> public class Bar {
>      @MatrixParam("mp1") private String mp1;
>      @MatrixParam("mp2") private String mp2;
>      @PathParam("pp")  private String pp;
>
>      public String getMP1() { return mp1; }
>      public String getMP2() { if(null != mp2) { return mp2; } else {
> return pp; } }
>      public String getPP() { if(null != mp1) { return getMP1(); } else
> { return getMP2(); } }
> }
>
>
> public class Baz {
>      @MatrixParam("a") private String a;
>      @PathParam("b") private String b;
>
>      public getA() { return a; }
>      public boolean isB() { if(b == null || b.equalsCase("") { return
> false; } return true; }
> }
>
> I also cross-posted to StackOverflow last week, and someone there
> could replicate the issue, it seems:
> http://stackoverflow.com/a/33191716/2018047
>
> Hope that helps in narrowing it down a bit...
>
> Brgrds,
> Christian
> P.S.: With my CXF knowledge being extremely limited, looking at the
> diffs for your test, I am wondering what URL you actually use - and
> where you execute the actual HTTP call?
>
> On Sun, Oct 18, 2015 at 4:05 PM, Sergey Beryozkin <sb...@gmail.com> wrote:
>> Hi
>>
>> I've added this test to 2.7.18-SNAPSHOT:
>>
>> http://git-wip-us.apache.org/repos/asf/cxf/commit/abc7838f
>>
>> Can you please prototype Bar and Baz beans, and tell more about their access
>> level, perhaps one of these classes is not public or is nested ?
>>
>> Also try 2.7.18-SNAPHOT (in a day or two), but also CXF 3.1.3.
>> While the best effort was made to have as many JAX-RS 2.0 features be
>> available to CXF 2.7.x users as possible, it it possible the relevant
>> implementation in 2.7.x is less robust
>>
>> Thanks, Sergey
>>
>>
>>
>> On 16/10/15 11:42, Sergey Beryozkin wrote:
>>>
>>> Hi Christian
>>>
>>> Thanks for reporting it - I'll look into it shortly.
>>> Multiple BeanParams in a single signature are allowed indeed
>>> Cheers, Sergey
>>> On 16/10/15 11:32, Christian Balzer wrote:
>>>>
>>>> Hello all,
>>>>
>>>> We are using Spring and Apache CXF.
>>>>
>>>> For the following example code, I get an exception. Which makes me
>>>> wonder: can I use two BeanParam annotations/beans in the same method
>>>> signature?
>>>>
>>>> import javax.ws.rs.BeanParam;
>>>> //...
>>>> @GET
>>>> @Produces({"application/json;charset=UTF-8"})
>>>> public Response doFoo(
>>>>           @BeanParam Bar bar,
>>>>           @BeanParam Bas bas,
>>>>           @Context UriInfo uriInfo)
>>>>           throws BazException {
>>>>
>>>> Here is the stack trace:
>>>>
>>>> javax.ws.rs.InternalServerErrorException: null
>>>> at
>>>>
>>>> org.apache.cxf.jaxrs.utils.SpecExceptions.toInternalServerErrorException(SpecExceptions.java:77)
>>>>
>>>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>>> at
>>>>
>>>> org.apache.cxf.jaxrs.utils.ExceptionUtils.toInternalServerErrorException(ExceptionUtils.java:110)
>>>>
>>>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>>> at
>>>>
>>>> org.apache.cxf.jaxrs.utils.JAXRSUtils.createBeanParamValue(JAXRSUtils.java:975)
>>>>
>>>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>>> at
>>>>
>>>> org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:767)
>>>>
>>>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>>> at
>>>>
>>>> org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:716)
>>>>
>>>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>>> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:265)
>>>> [cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>>> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:101)
>>>> [cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>>>
>>>> In JAXRSUtils, I can see this:
>>>>
>>>> BeanParamInfo bmi =
>>>> ProviderFactory.getInstance(m).getBeanParamInfo(clazz);
>>>> if (bmi == null) {
>>>>       // we could've started introspecting now but the fact no bean info
>>>>       // is available indicates that the one created at start up has been
>>>>       // lost and hence it is 500
>>>>       LOG.warning("Bean parameter info is not available");
>>>>       throw ExceptionUtils.toInternalServerErrorException(null, null);
>>>> }
>>>>
>>>> Which is the exception that gets thrown.
>>>>
>>>> Is there any hint in this on what I'm doing wrong? Things seem to work
>>>> when I comment out the "@BeanParam Bas bas," line... Am I maybe not
>>>> allowed to use two @BeanParam in the same method signature? (I
>>>> couldn't find any hint that I wouldn't be, though...)
>>>>
>>>> Kind regards,
>>>>
>>>> Christian
>>>> P.S.: This is a cross-post from StackOverflow:
>>>> http://stackoverflow.com/q/33168074/2018047
>>>>
>>>
>>
>>
>> --
>> Sergey Beryozkin
>>
>> Talend Community Coders
>> http://coders.talend.com/


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Re: Using two javax @BeanParam beans in the same method signature results in InternalServerErrorException

Posted by Christian Balzer <ch...@gmail.com>.
Hi Sergey,

Sorry it took a little longer to reply. So, I did try with CXF
2.7.18-SNAPSHOT today, but had the same results.
CXF 3.1.3 failed to compile, as maven is reporting a convergence
error, so I couldn't test that. (I'm not too surprised; I was told by
colleagues we couldn't move to version 3 just yet.)

I'm not quite sure what you mean by prototyping, but I suspect you'd
like to see what the beans look like?
They are each standalone public classes, with private fields and
public getters - some of which hold logic.
What I noticed is that a signature like doFoo(@BeanParam Bar bar,
@MatrixParam("p2") p2, ...) works, while doFoo(@BeanParam Bar bar1,
@BeanParam Bar bar2, ...) fails. So I'm tempted to rule out the beans
themselves as the cause to the issue...

Anyway, this is what the beans roughly look like:

public class Bar {
    @MatrixParam("mp1") private String mp1;
    @MatrixParam("mp2") private String mp2;
    @PathParam("pp")  private String pp;

    public String getMP1() { return mp1; }
    public String getMP2() { if(null != mp2) { return mp2; } else {
return pp; } }
    public String getPP() { if(null != mp1) { return getMP1(); } else
{ return getMP2(); } }
}


public class Baz {
    @MatrixParam("a") private String a;
    @PathParam("b") private String b;

    public getA() { return a; }
    public boolean isB() { if(b == null || b.equalsCase("") { return
false; } return true; }
}

I also cross-posted to StackOverflow last week, and someone there
could replicate the issue, it seems:
http://stackoverflow.com/a/33191716/2018047

Hope that helps in narrowing it down a bit...

Brgrds,
Christian
P.S.: With my CXF knowledge being extremely limited, looking at the
diffs for your test, I am wondering what URL you actually use - and
where you execute the actual HTTP call?

On Sun, Oct 18, 2015 at 4:05 PM, Sergey Beryozkin <sb...@gmail.com> wrote:
> Hi
>
> I've added this test to 2.7.18-SNAPSHOT:
>
> http://git-wip-us.apache.org/repos/asf/cxf/commit/abc7838f
>
> Can you please prototype Bar and Baz beans, and tell more about their access
> level, perhaps one of these classes is not public or is nested ?
>
> Also try 2.7.18-SNAPHOT (in a day or two), but also CXF 3.1.3.
> While the best effort was made to have as many JAX-RS 2.0 features be
> available to CXF 2.7.x users as possible, it it possible the relevant
> implementation in 2.7.x is less robust
>
> Thanks, Sergey
>
>
>
> On 16/10/15 11:42, Sergey Beryozkin wrote:
>>
>> Hi Christian
>>
>> Thanks for reporting it - I'll look into it shortly.
>> Multiple BeanParams in a single signature are allowed indeed
>> Cheers, Sergey
>> On 16/10/15 11:32, Christian Balzer wrote:
>>>
>>> Hello all,
>>>
>>> We are using Spring and Apache CXF.
>>>
>>> For the following example code, I get an exception. Which makes me
>>> wonder: can I use two BeanParam annotations/beans in the same method
>>> signature?
>>>
>>> import javax.ws.rs.BeanParam;
>>> //...
>>> @GET
>>> @Produces({"application/json;charset=UTF-8"})
>>> public Response doFoo(
>>>          @BeanParam Bar bar,
>>>          @BeanParam Bas bas,
>>>          @Context UriInfo uriInfo)
>>>          throws BazException {
>>>
>>> Here is the stack trace:
>>>
>>> javax.ws.rs.InternalServerErrorException: null
>>> at
>>>
>>> org.apache.cxf.jaxrs.utils.SpecExceptions.toInternalServerErrorException(SpecExceptions.java:77)
>>>
>>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>> at
>>>
>>> org.apache.cxf.jaxrs.utils.ExceptionUtils.toInternalServerErrorException(ExceptionUtils.java:110)
>>>
>>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>> at
>>>
>>> org.apache.cxf.jaxrs.utils.JAXRSUtils.createBeanParamValue(JAXRSUtils.java:975)
>>>
>>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>> at
>>>
>>> org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:767)
>>>
>>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>> at
>>>
>>> org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:716)
>>>
>>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:265)
>>> [cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:101)
>>> [cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>>
>>> In JAXRSUtils, I can see this:
>>>
>>> BeanParamInfo bmi =
>>> ProviderFactory.getInstance(m).getBeanParamInfo(clazz);
>>> if (bmi == null) {
>>>      // we could've started introspecting now but the fact no bean info
>>>      // is available indicates that the one created at start up has been
>>>      // lost and hence it is 500
>>>      LOG.warning("Bean parameter info is not available");
>>>      throw ExceptionUtils.toInternalServerErrorException(null, null);
>>> }
>>>
>>> Which is the exception that gets thrown.
>>>
>>> Is there any hint in this on what I'm doing wrong? Things seem to work
>>> when I comment out the "@BeanParam Bas bas," line... Am I maybe not
>>> allowed to use two @BeanParam in the same method signature? (I
>>> couldn't find any hint that I wouldn't be, though...)
>>>
>>> Kind regards,
>>>
>>> Christian
>>> P.S.: This is a cross-post from StackOverflow:
>>> http://stackoverflow.com/q/33168074/2018047
>>>
>>
>
>
> --
> Sergey Beryozkin
>
> Talend Community Coders
> http://coders.talend.com/

Re: Using two javax @BeanParam beans in the same method signature results in InternalServerErrorException

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi

I've added this test to 2.7.18-SNAPSHOT:

http://git-wip-us.apache.org/repos/asf/cxf/commit/abc7838f

Can you please prototype Bar and Baz beans, and tell more about their 
access level, perhaps one of these classes is not public or is nested ?

Also try 2.7.18-SNAPHOT (in a day or two), but also CXF 3.1.3.
While the best effort was made to have as many JAX-RS 2.0 features be 
available to CXF 2.7.x users as possible, it it possible the relevant 
implementation in 2.7.x is less robust

Thanks, Sergey


On 16/10/15 11:42, Sergey Beryozkin wrote:
> Hi Christian
>
> Thanks for reporting it - I'll look into it shortly.
> Multiple BeanParams in a single signature are allowed indeed
> Cheers, Sergey
> On 16/10/15 11:32, Christian Balzer wrote:
>> Hello all,
>>
>> We are using Spring and Apache CXF.
>>
>> For the following example code, I get an exception. Which makes me
>> wonder: can I use two BeanParam annotations/beans in the same method
>> signature?
>>
>> import javax.ws.rs.BeanParam;
>> //...
>> @GET
>> @Produces({"application/json;charset=UTF-8"})
>> public Response doFoo(
>>          @BeanParam Bar bar,
>>          @BeanParam Bas bas,
>>          @Context UriInfo uriInfo)
>>          throws BazException {
>>
>> Here is the stack trace:
>>
>> javax.ws.rs.InternalServerErrorException: null
>> at
>> org.apache.cxf.jaxrs.utils.SpecExceptions.toInternalServerErrorException(SpecExceptions.java:77)
>>
>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>> at
>> org.apache.cxf.jaxrs.utils.ExceptionUtils.toInternalServerErrorException(ExceptionUtils.java:110)
>>
>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>> at
>> org.apache.cxf.jaxrs.utils.JAXRSUtils.createBeanParamValue(JAXRSUtils.java:975)
>>
>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>> at
>> org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:767)
>>
>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>> at
>> org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:716)
>>
>> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:265)
>> [cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:101)
>> [cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>>
>> In JAXRSUtils, I can see this:
>>
>> BeanParamInfo bmi =
>> ProviderFactory.getInstance(m).getBeanParamInfo(clazz);
>> if (bmi == null) {
>>      // we could've started introspecting now but the fact no bean info
>>      // is available indicates that the one created at start up has been
>>      // lost and hence it is 500
>>      LOG.warning("Bean parameter info is not available");
>>      throw ExceptionUtils.toInternalServerErrorException(null, null);
>> }
>>
>> Which is the exception that gets thrown.
>>
>> Is there any hint in this on what I'm doing wrong? Things seem to work
>> when I comment out the "@BeanParam Bas bas," line... Am I maybe not
>> allowed to use two @BeanParam in the same method signature? (I
>> couldn't find any hint that I wouldn't be, though...)
>>
>> Kind regards,
>>
>> Christian
>> P.S.: This is a cross-post from StackOverflow:
>> http://stackoverflow.com/q/33168074/2018047
>>
>


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Re: Using two javax @BeanParam beans in the same method signature results in InternalServerErrorException

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi Christian

Thanks for reporting it - I'll look into it shortly.
Multiple BeanParams in a single signature are allowed indeed
Cheers, Sergey
On 16/10/15 11:32, Christian Balzer wrote:
> Hello all,
>
> We are using Spring and Apache CXF.
>
> For the following example code, I get an exception. Which makes me
> wonder: can I use two BeanParam annotations/beans in the same method
> signature?
>
> import javax.ws.rs.BeanParam;
> //...
> @GET
> @Produces({"application/json;charset=UTF-8"})
> public Response doFoo(
>          @BeanParam Bar bar,
>          @BeanParam Bas bas,
>          @Context UriInfo uriInfo)
>          throws BazException {
>
> Here is the stack trace:
>
> javax.ws.rs.InternalServerErrorException: null
> at org.apache.cxf.jaxrs.utils.SpecExceptions.toInternalServerErrorException(SpecExceptions.java:77)
> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
> at org.apache.cxf.jaxrs.utils.ExceptionUtils.toInternalServerErrorException(ExceptionUtils.java:110)
> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
> at org.apache.cxf.jaxrs.utils.JAXRSUtils.createBeanParamValue(JAXRSUtils.java:975)
> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
> at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:767)
> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
> at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:716)
> ~[cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:265)
> [cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:101)
> [cxf-rt-frontend-jaxrs-2.7.15.jar:2.7.15]
>
> In JAXRSUtils, I can see this:
>
> BeanParamInfo bmi = ProviderFactory.getInstance(m).getBeanParamInfo(clazz);
> if (bmi == null) {
>      // we could've started introspecting now but the fact no bean info
>      // is available indicates that the one created at start up has been
>      // lost and hence it is 500
>      LOG.warning("Bean parameter info is not available");
>      throw ExceptionUtils.toInternalServerErrorException(null, null);
> }
>
> Which is the exception that gets thrown.
>
> Is there any hint in this on what I'm doing wrong? Things seem to work
> when I comment out the "@BeanParam Bas bas," line... Am I maybe not
> allowed to use two @BeanParam in the same method signature? (I
> couldn't find any hint that I wouldn't be, though...)
>
> Kind regards,
>
> Christian
> P.S.: This is a cross-post from StackOverflow:
> http://stackoverflow.com/q/33168074/2018047
>