cxf-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: JSON ignore namespace behavior in IgnoreContentJettisonWriter
Date Mon, 10 Oct 2011 08:54:54 GMT
Hi

I think I got that fixed for the now being released 2.4.3 and 2.3.7, I 
updated that code to block 'nil' attribute too.

so, now it looks like this

if (!writeXsiType && "xsi".equals(prefix)
     ("type".equals(local) || "nill".equals(local))) {
           return;
}

Alternatively you can set a namespaceMap containing an xsi namespace, 
but the above should fix the issue...
Try please 2.4.3 when it's available
Cheers, Sergey

On 09/10/11 21:49, K Fung wrote:
> Hi all,
>
> (not sure if this belongs in cxf-dev or cxf-user; given the level of code
> detail here though, I'm thinking cxf-dev but feel free to redirect if
> appropriate)
>
> I'm looking to get some advice on how to fix a WebApplicationException /
> IllegalStateException inside CXF's JSON code. I've got a solution in mind
> for the CXF code but I'm not an expert in JSON so I'm wondering if my code
> is incorrect or if this is truely a bug in CXF?
>
> In my scenario, CXF is generating the following exception:
>
> WARNING: WebApplicationException has been caught : Invalid JSON namespace:
> http://www.w3.org/2001/XMLSchema-instance
>   even when I have JSONProvider.setIgnoreNamespaces to be true.
>
> The XML output is fine:
>
> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
>   <Library xmlns:ns2="http://example.com/2011/book">
> <Book>
>   <ns2:Book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:nil="true"/>
>   </Book>
> </Library>
>
> However, the JSON output fails with HTTP 500 due to the above
> WebApplicationException.
>
> Looking at the source code, I can see that it's failing in
> IgnoreContentJettisonWriter:
>
> public void writeAttribute(String prefix, String uri,
>                             String local, String value) throws
> XMLStreamException {
>      if (!writeXsiType&&  "type".equals(local)&&  "xsi".equals(prefix))
{
>          return;
>      }
>      super.writeAttribute(prefix, uri, local, value);
>
> }
>
> At the time of invocation for IgnoreContentJettisonWriter.writeAttribute, we
> have the following values:
>
> prefix = xsi
> uri = http://www.w3.org/2001/XMLSchema-instance
>   local = nil
> value = true
> writeXsiType = false
>
> Given these values, we still call super.writeAttribute which then
> consequently bombs with the IllegalStateException.
>
> To me, the naive solution in this scenario would be the following: If
> writeXsiType is set to false and local != "type", super.writeAttribute
> should be called with a null value for uri. With this change, the JSON
> output looks like the following:
>
> {"Library":
> {"Book":
> {"Book":
>   {"@nil":"true"}
> }
> }
>   }
>
> What are your thoughts? Would there be any issues with reading this JSON?
>
> Regards,
> kl
>
> Appendix A: JAXB Classes
>
> @XmlAccessorType(XmlAccessType.FIELD)
> @XmlType(name = "", propOrder = {"book"})
> @XmlRootElement(name = "Library")
> public class Library {
>
>      @XmlElement(name = "Book", required = true)
>      protected List<Book>  book;
>
>      public List<Book>  getBook() {
>          if (this.book == null) {
>              this.book = new ArrayList<Book>();
>          }
>          return this.book;
>      }
>
>      public void setBook(List<Book>  l) {
>          this.book = l;
>      }
>
> }
>
> @XmlAccessorType(XmlAccessType.FIELD)
> @XmlType(name="Book", propOrder={"book"})
> public class Book
> {
>
>    @XmlElement(name="Book", namespace="http://example.com/2011/book",
> required=true, nillable=true)
>    protected String book;
>
>    public String getBook()
>    {
>      return this.book;
>    }
>
>    public void setBook(String value)
>    {
>      this.book = value;
>    }
> }
>
> Appendix B: Invocation Example
>
>      @GET
>      @Path("book")
>      public Library getBook() throws JAXBException {
>
>          final Book john = new Book();
>          john.setBook(null);
>
>          Library lib = new Library();
>          List<Book>  l = new ArrayList<Book>(1);
>          l.add(john);
>          docs.setBook(l);
>
>          return lib;
>      }
>


Mime
View raw message