cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sergey Beryozkin (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CXF-5976) incompatible with javax.xml.bind.JAXBElement error when using List<JAXBElement<Book>> as resource method param
Date Tue, 02 Sep 2014 12:45:21 GMT

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

Sergey Beryozkin commented on CXF-5976:
---------------------------------------

Try 3.0.2-SNAPSHOT from a Maven snapshots repository 
Cheers, 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
>            Assignee: Sergey Beryozkin
>             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)

Mime
View raw message