[
https://issues.apache.org/jira/browse/CXF-5976?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14117372#comment-14117372
]
Sergey Beryozkin commented on CXF-5976:
---------------------------------------
Hi, to be honest I think it is difficult to expect the interoperability in
cases where explicit collections are used because every runtime may use its own
mechanism to deal with reading/writing such collections. Not sure how it worked
with Wink, but I did update some of CXF code for it to work, in a CXF to CXF
calls at least. Give the snapshots a try please
Thanks, Sergey
> incompatible with javax.xml.bind.JAXBElement error when using
> List<JAXBElement<Book>> as resource method param
> ---------------------------------------------------------------------------------------------------------------
>
> Key: CXF-5976
> URL: https://issues.apache.org/jira/browse/CXF-5976
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS, JAXB Databinding
> Affects Versions: 3.0.1
> Reporter: Bin Zhu
> Fix For: 3.0.2, 3.1.0
>
>
> I'm migrating App to CXF3.0.1 from wink. There will be ClassCastException if
> I using JAXBElement List (e.g. List<JAXBElement<Book>>) in the resource
> method.
> e.g.
> @Path("booklistjaxbelement")
> @Produces(MediaType.APPLICATION_XML)
> @Consumes(MediaType.APPLICATION_XML)
> @POST
> public List<JAXBElement<Book>>
> echoJAXBElementBookList(List<JAXBElement<Book>> bookElements) {
> List<JAXBElement<Book>> ret = new ArrayList<JAXBElement<Book>>();
> Author author = null;
> Author retAuthor = null;
> Book retBook = null;
> for (JAXBElement<Book> bookElement : bookElements) {
> author = bookElement.getValue().getAuthor();
> retAuthor = new Author();
> retAuthor.setFirstName("echo " + author.getFirstName());
> retAuthor.setLastName("echo " + author.getLastName());
> retBook = new Book();
> retBook.setAuthor(retAuthor);
> retBook.setTitle("echo " + bookElement.getValue().getTitle());
> JAXBElement<Book> element = new JAXBElement<Book>(new
> QName("book"), Book.class, retBook);
> ret.add(element);
> }
> return ret;
> }
> Book is an JAXB bean like this:
> @XmlRootElement
> public class Book {
> private Author author;
> private String title;
> public Author getAuthor() {
> return author;
> }
> public void setAuthor(Author author) {
> this.author = author;
> }
> public String getTitle() {
> return title;
> }
> ....
> Test client is like this:
> List<Book> source = getBookSource();
> Resource resource = client.resource(JAXB_BASE_URI +
> "/booklistjaxbelement");
> ClientResponse response =
>
> resource.accept(MediaType.APPLICATION_XML).contentType(MediaType.APPLICATION_XML)
> .post(new
> GenericEntity<List<Book>>(source) {
> });
> List<Book> responseEntity = response.getEntity(new
> EntityType<List<Book>>() {
> });
> -------------------
> Debugged CXF code and find in AbstractInvoker. performInvocation, it will
> invoke the method.invoke. The value of paramArray here is Book ArrayList and
> caused this issue.
> This scenario is working in wink, but doesn't work here...
>
> protected Object performInvocation(Exchange exchange, final Object
> serviceObject, Method m,
> Object[] paramArray) throws Exception {
> paramArray = insertExchange(m, paramArray, exchange);
> if (LOG.isLoggable(Level.FINER)) {
> LOG.log(Level.FINER, "INVOKING_METHOD", new Object[]
> {serviceObject,
> m,
>
> Arrays.asList(paramArray)});
> }
> return m.invoke(serviceObject, paramArray);
> }
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)