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 17:12:31 GMT
Hi

On 10/10/11 17:44, K Fung wrote:
> Hi Sergey,
>
> I should have checked trunk before writing that e-mail :(

no problems :-)

>
> It is indeed fixed in trunk (and thus I assume the latest 2.3.x and 2.4.x).

Yes.
Cheers, Sergey


>
> Thanks for the timely reply!
>
> Regards,
> kl
>
> On Mon, Oct 10, 2011 at 1:54 AM, Sergey Beryozkin<sberyozkin@gmail.com>wrote:
>
>> 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<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<http://example.com/2011/book>
>>> ">
>>> <Book>
>>>   <ns2:Book xmlns:xsi="http://www.w3.org/**2001/XMLSchema-instance<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<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<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