Hi

Sorry if this is obvious, but I can't find an answer. Spring 2.5, CXF
2.1, Jettison 1.0.1.

It's ok, not obvious to me at all :-)


I've got a SOAP and a REST service both being configured in Spring..
REST works for XML, but I get an "Invalid JSON namespace" error if I
try to use JSON. I've tried to inject the correct Jettison mapping,
which doesn't seem to work. HOWEVER, it does seem to be doing the
right thing with the "cxf" namespace on error.

Spring config:

    <util:map id="jsonNamespaceMap" map-class="java.util.Hashtable">
        <entry key="http://www.acme.com/test"; value="t"/>
        <entry key="http://cxf.apache.org/bindings/xformat";
value="cxf"/>
    </util:map>

    <bean id="jsonInputFactory"
        class="org.codehaus.jettison.mapped.MappedXMLInputFactory">
        <constructor-arg ref="jsonNamespaceMap"/>
    </bean>

    <bean id="jsonOutputFactory"
        class="org.codehaus.jettison.mapped.MappedXMLOutputFactory">
        <constructor-arg ref="jsonNamespaceMap"/>
    </bean>

Just would like to clarify :

Do you expect that the bean with id 'jsonOutputFactory' is to be used as a org.codehaus.jettison.mapped.MappedXMLOutputFactory instance ?

At the moment, no jaxrs:properties are checked. But that can be fixed...

Cheers, Sergey




    <jaxrs:server id="systemEndpoint" address="/system">
        <jaxrs:serviceBeans>
            <ref bean="systemImpl"/>
        </jaxrs:serviceBeans>
        <jaxrs:properties>
            <entry key="javax.xml.stream.XMLInputFactory">
                <ref bean="jsonInputFactory"/>
            </entry>
            <entry key="javax.xml.stream.XMLOutputFactory">
                <ref bean="jsonOutputFactory"/>
            </entry>
        </jaxrs:properties>
    </jaxrs:server>

Return type;
@XmlRootElement(name = "JSONTest", namespace = "http://www.acme.com/
test")
@XmlType(name = "", propOrder = {"a", "b", "c"})
@XmlAccessorType(XmlAccessType.FIELD)
public class JSONTest {
    @XmlElement
    private String a;
    @XmlElement
    private String b;
    @XmlElement
    private String c;

REST impl:
    @GET
    @Path("/jupdate/")
    public JSONTest jupdates() {
        JSONTest b = new JSONTest("1", "2", "3");
        return b;
    }

$ curl -H "Accept: application/xml" http://localhost:8080/test/system/jupdate
<ns2:JSONTest xmlns:ns2="http://www.acme.com/test";><a>1</a><b>2</
b><c>3</c></ns2:JSONTest>

$ curl -H "Accept: application/json" http://localhost:8080/test/system/jupdate
{"cxf.XMLFault":{"cxf.faultstring":"java.lang.IllegalStateException:
Invalid JSON namespace: http:\/\/www.acme.com\/test"}}

Log file:
java.lang.IllegalStateException: Invalid JSON namespace: 
http://www.acme.com/test
        at
org
.codehaus
.jettison
.mapped
.MappedNamespaceConvention
.getJSONNamespace(MappedNamespaceConvention.java:151)
        at
org
.codehaus
.jettison
.mapped
.MappedNamespaceConvention.createKey(MappedNamespaceConvention.java:158)
        at
org
.codehaus
.jettison
.mapped
.MappedXMLStreamWriter.writeStartElement(MappedXMLStreamWriter.java:241)
        at
com
.sun
.xml
.bind
.v2
.runtime
.output.XMLStreamWriterOutput.beginStartTag(XMLStreamWriterOutput.java:
113)
...

If I remove the namespace declaration from JSONTest, I get a valid
answer, but the types on the wire are really JAXB generated and I want
namespaces on them for the XML domain:

$ curl -H "Accept: application/json" http://localhost:8080/test/system/jupdate
{"JSONTest":{"a":1,"b":2,"c":3}}

--Joe



----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland

Reply via email to