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<sberyoz...@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;
     }





Reply via email to