-
1. Re: Custom class with Jboss.net
cgjung Feb 25, 2004 2:30 AM (in response to carcudi)The usual place for application objects is ... tara ... the application package, in your case the the ejb-jar.
To deal with these classes, JBoss.net/Axis however needs mapping information in the form of a serializer/deserializer pair (e.g. a Bean(De)Serializer that canonically maps bean properties to xml elements). This can be specified in the webservice deployment descriptor (in your wsr) as follows:
Note that as of JBoss3.2, these descriptors can be easily generated using our jboss.net xdoclet module and tag annotations in your custom objects:
/**
* A serializable data object for testing data passed to an EJB through
* the web service interface.
* @author jung
* @version $Revision: 1.1.2.1 $
* @jboss-net:xml-schema urn="hello:HelloData"
*/
public class HelloData
implements java.io.Serializable
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
Hope that helps,
CGJ -
2. Re: Custom class with Jboss.net
carcudi Feb 25, 2004 8:59 AM (in response to carcudi)Thank you for your reply, Dr. Jung.
However, I wanted to let you know that I followed Neal Sanche's example to the letter, including the xml-schema tag you mention in your reply. The generated web-services.xml file appears below.
As you can see, the cert:User class has been identified by the xdoclet plugin and included in the file. I can confirm that the User class is included in the ejb.jar file as well.
Our application deployments do have a special application-scoped class loader, but even when I disable that loader, the classDefNotFound errors persist.
web-services.xml file:<?xml version="1.0" encoding="UTF-8" ?> - <!-- --> - <!-- This JBoss.Net Web Service Descriptor has been generated by XDoclet --> - <!-- and is brought to you by F. M. Brier, C. G. Jung and J. Essington --> - <!-- --> - <deployment name="cert" xmlns="http://xml.apache.org/axis/wsdd/" targetNamespace="http://cvs.east.frontiercorp.com/cert" xmlns:cert="http://cvs.east.frontiercorp.com/cert" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> - <!-- The following are declarations of service endpoints targetted to session beans --> - <service name="ListProvider" provider="Handler"> <parameter name="handlerClass" value="org.jboss.net.axis.server.EJBProvider" /> <parameter name="beanJndiName" value="cap/cert/ejb/ListProviderLocalEjb" /> <parameter name="allowedMethods" value="getList getListValue" /> - <requestFlow name="ListProviderRequest"> - <handler type="java:org.jboss.net.axis.server.JBossAuthenticationHandler"> <parameter name="securityDomain" value="java:/jaas/cap_hybrid" /> <parameter name="validateUnauthenticatedCalls" value="false" /> </handler> - <handler type="java:org.jboss.net.axis.server.JBossAuthorizationHandler"> <parameter name="securityDomain" value="java:/jaas/cap_hybrid" /> <parameter name="allowedRoles" value="Cert_Admin, Cert_User, Cert_ReadOnly" /> </handler> - <!-- this is a temporary solution to allow immediate (de-)serialization of entity beans in the web service layer --> <handler type="java:org.jboss.net.axis.server.TransactionRequestHandler" /> </requestFlow> - <responseFlow name="ListProviderResponse"> - <!-- this is a temporary solution to allow immediate (de-)serialization of entity beans in the web service layer --> <handler type="java:org.jboss.net.axis.server.SerialisationResponseHandler" /> <handler type="java:org.jboss.net.axis.server.TransactionResponseHandler" /> </responseFlow> </service> - <service name="WebServiceTest" provider="Handler"> <parameter name="handlerClass" value="org.jboss.net.axis.server.EJBProvider" /> <parameter name="beanJndiName" value="cap/cert/ejb/WebServiceTestEjbLocal" /> <parameter name="allowedMethods" value="getName" /> - <operation name="getName" returnQName="Greeting"> <parameter name="Name" /> </operation> - <requestFlow name="WebServiceTestRequest"> - <handler type="java:org.jboss.net.axis.server.JBossAuthenticationHandler"> <parameter name="securityDomain" value="java:/jaas/cap_hybrid" /> <parameter name="validateUnauthenticatedCalls" value="false" /> </handler> - <handler type="java:org.jboss.net.axis.server.JBossAuthorizationHandler"> <parameter name="securityDomain" value="java:/jaas/cap_hybrid" /> <parameter name="allowedRoles" value="Cert_Admin, Cert_User, Cert_ReadOnly" /> </handler> - <!-- this is a temporary solution to allow immediate (de-)serialization of entity beans in the web service layer --> <handler type="java:org.jboss.net.axis.server.TransactionRequestHandler" /> </requestFlow> - <responseFlow name="WebServiceTestResponse"> - <!-- this is a temporary solution to allow immediate (de-)serialization of entity beans in the web service layer --> <handler type="java:org.jboss.net.axis.server.SerialisationResponseHandler" /> <handler type="java:org.jboss.net.axis.server.TransactionResponseHandler" /> </responseFlow> </service> - <service name="ComplexWebServiceTest" provider="Handler"> <parameter name="handlerClass" value="org.jboss.net.axis.server.EJBProvider" /> <parameter name="beanJndiName" value="cap/cert/ejb/ComplexWebServiceTestEjbLocal" /> <parameter name="allowedMethods" value="getName getMap getUser" /> - <operation name="getName" returnQName="Greeting"> <parameter name="Name" /> </operation> - <operation name="getMap" returnQName="MapGreeting"> <parameter name="someData" /> </operation> - <operation name="getUser" returnQName="UserGreeting"> <parameter name="name" /> </operation> - <requestFlow name="ComplexWebServiceTestRequest"> - <handler type="java:org.jboss.net.axis.server.JBossAuthenticationHandler"> <parameter name="securityDomain" value="java:/jaas/cap_hybrid" /> <parameter name="validateUnauthenticatedCalls" value="false" /> </handler> - <handler type="java:org.jboss.net.axis.server.JBossAuthorizationHandler"> <parameter name="securityDomain" value="java:/jaas/cap_hybrid" /> <parameter name="allowedRoles" value="Cert_Admin, Cert_User, Cert_ReadOnly" /> </handler> - <!-- this is a temporary solution to allow immediate (de-)serialization of entity beans in the web service layer --> <handler type="java:org.jboss.net.axis.server.TransactionRequestHandler" /> </requestFlow> - <responseFlow name="ComplexWebServiceTestResponse"> - <!-- this is a temporary solution to allow immediate (de-)serialization of entity beans in the web service layer --> <handler type="java:org.jboss.net.axis.server.SerialisationResponseHandler" /> <handler type="java:org.jboss.net.axis.server.TransactionResponseHandler" /> </responseFlow> </service> - <!-- The following are typemappings for entity beans for implementing the implicit web-service value-object pattern --> - <!-- The following are typemappings for bean-type value-objects --> <typeMapping qname="cert:User" type="java:com.frontiercorp.bss.cap.cert.webservice.User" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> - <!-- There follow merged custom web service descriptions --> </deployment>
-
3. Re: Custom class with Jboss.net
cgjung Feb 27, 2004 3:05 AM (in response to carcudi)which version of jboss are you using?
(NoClassDefs in contrast to ClassNotFounds are a hint that not the
target class itself could not be found, but a linked class from there).
How do you deploy the whole stuff ear(ejb-jar,wsr)?
Could you maybe send me a small deployment unit such that I could verify it?
CGJ -
4. Re: Custom class with Jboss.net
carcudi Feb 27, 2004 12:49 PM (in response to carcudi)Dr. Jung. Thank you again for your reply.
There were two issues I was tripping over. The first (see the odd posting starting with "Eye of Newt" in this forum), had to do with a class collision between the commons-logging.jar file I was loading in my WAR and the commons-loading.jar already in the jboss-net sub-directory. That was easy to solve (once I figured out what was going on).
This other one had an equally simple solution, though the results are slightly imperfect. If I include a copy of the custom class (actually the full jar from the project) in the wsr file, the class deploys without issue.
-- Actually, something you said in your last post made me want to try it without the jar. That seems to work now as well --
The only issue remaining may not have a resolution. The class gets recognized during the WSDL generation as cert:User, but SoapEnvelopes returned from calls to the service list the class as ns1:User, and java sees the class as org.apache.crimson.tree.ElementNode2, which that's probably a default. The upshot is that Java Clients have to treat the object as a Node rather than as an Object. Since our consumer is a .NET client, that may not be an issue.
If you have any thoughts on this, please let me know:
(FYI: Jboss 3.2.2. Please let me know if you would still like to see a sample deployment unit.)
SOAP:<?xml version="1.0" encoding="UTF-8" ?> - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <soapenv:Body> - <getUserResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <UserGreeting href="#id0" /> </getUserResponse> - <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns1:User" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://cvs.east.frontiercorp.com/cert"> <name xsi:type="xsd:string">My Name</name> </multiRef> </soapenv:Body> </soapenv:Envelope>
WSDL:<?xml version="1.0" encoding="UTF-8" ?> - <wsdl:definitions targetNamespace="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" xmlns:intf="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://cvs.east.frontiercorp.com/cert" xmlns:tns2="http://net.jboss.org/jmx" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <wsdl:types> - <schema targetNamespace="http://cvs.east.frontiercorp.com/cert" xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> - <complexType name="User"> - <sequence> <element name="name" nillable="true" type="xsd:string" /> </sequence> </complexType> </schema> - <schema targetNamespace="http://net.jboss.org/jmx" xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> - <simpleType name="ObjectNameType"> - <simpleContent> <extension base="xsd:string" /> </simpleContent> </simpleType> </schema> - <schema targetNamespace="http://xml.apache.org/xml-soap" xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> - <complexType name="mapItem"> - <sequence> <element name="key" nillable="true" type="xsd:string" /> <element name="value" nillable="true" type="xsd:string" /> </sequence> </complexType> - <complexType name="Map"> - <sequence> <element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem" /> </sequence> </complexType> </schema> - <schema targetNamespace="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> - <complexType name="ArrayOf_apachesoap_Map"> - <complexContent> - <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="apachesoap:Map[]" /> </restriction> </complexContent> </complexType> </schema> </wsdl:types> - <wsdl:message name="getNameResponse"> <wsdl:part name="Greeting" type="xsd:string" /> </wsdl:message> - <wsdl:message name="getMapResponse"> <wsdl:part name="MapGreeting" type="impl:ArrayOf_apachesoap_Map" /> </wsdl:message> - <wsdl:message name="getUserRequest"> <wsdl:part name="name" type="xsd:string" /> </wsdl:message> - <wsdl:message name="getMapRequest"> <wsdl:part name="someData" type="xsd:string" /> </wsdl:message> - <wsdl:message name="getNameRequest"> <wsdl:part name="Name" type="xsd:string" /> </wsdl:message> - <wsdl:message name="getUserResponse"> <wsdl:part name="UserGreeting" type="tns1:User" /> </wsdl:message> - <wsdl:portType name="ComplexWebServiceTestEjbLocal"> - <wsdl:operation name="getName" parameterOrder="Name"> <wsdl:input message="impl:getNameRequest" name="getNameRequest" /> <wsdl:output message="impl:getNameResponse" name="getNameResponse" /> </wsdl:operation> - <wsdl:operation name="getMap" parameterOrder="someData"> <wsdl:input message="impl:getMapRequest" name="getMapRequest" /> <wsdl:output message="impl:getMapResponse" name="getMapResponse" /> </wsdl:operation> - <wsdl:operation name="getUser" parameterOrder="name"> <wsdl:input message="impl:getUserRequest" name="getUserRequest" /> <wsdl:output message="impl:getUserResponse" name="getUserResponse" /> </wsdl:operation> </wsdl:portType> - <wsdl:binding name="ComplexWebServiceTestSoapBinding" type="impl:ComplexWebServiceTestEjbLocal"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> - <wsdl:operation name="getName"> <wsdlsoap:operation soapAction="ComplexWebServiceTest" /> - <wsdl:input name="getNameRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" use="encoded" /> </wsdl:input> - <wsdl:output name="getNameResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" use="encoded" /> </wsdl:output> </wsdl:operation> - <wsdl:operation name="getMap"> <wsdlsoap:operation soapAction="ComplexWebServiceTest" /> - <wsdl:input name="getMapRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" use="encoded" /> </wsdl:input> - <wsdl:output name="getMapResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" use="encoded" /> </wsdl:output> </wsdl:operation> - <wsdl:operation name="getUser"> <wsdlsoap:operation soapAction="ComplexWebServiceTest" /> - <wsdl:input name="getUserRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" use="encoded" /> </wsdl:input> - <wsdl:output name="getUserResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" use="encoded" /> </wsdl:output> </wsdl:operation> </wsdl:binding> - <wsdl:service name="ComplexWebServiceTestEjbLocalService"> - <wsdl:port binding="impl:ComplexWebServiceTestSoapBinding" name="ComplexWebServiceTest"> <wsdlsoap:address location="http://localhost:8080/jboss-net/services/ComplexWebServiceTest" /> </wsdl:port> </wsdl:service> </wsdl:definitions>