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 <[email protected]> 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/

Reply via email to