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;
}