Nurring
25-09-2009, 11:46
Salve a tutti......
Uso SEAM per un mio progetto e ho ora la necessità di esporre un WebService dalla mia applicazione web.....
Ho letto varie guide in giro per il mondo ma nessuna mi ha portato a un risultato soddisfacente, così chiedo qui, magari qualcuno è già passato per queste strade e puo' aiutarmi...
Espongo 2 modi diversi usati da me per implementare i webSerrvices con SEAM, anche se entrambi hanno presentato dei problemi.
( Jboss 4.0, SEAM 2.0.2, Java 1.6_10)
Intanto in entrambi i casi ho importato il seguenti jar nella cartella ENSORSED di Jboss:
* jaxb-api.jar
* jbossws-native-jaxrpc.jar
* jbossws-native-jaxws.jar
* jbossws-native-jaxws-ext.jar
* jbossws-native-saaj.jar
1) Definendo il WS sul file web.xml:
Ho la mia classe con le annotation
@Name("provaWebServiceImpl")
@Stateless
@SOAPBinding(style = SOAPBinding.Style.RPC)
@WebService
public class ProvaWebServiceImpl implements ProvaWebService{
@WebMethod
public int somma(int x, int y) {
Lifecycle.beginCall();
Sommatore sommatore= (Sommatore ) Component.getInstance("sommatore");
return sommatore.somma(x,y);}
}
e la parte web.xml che mi definisce il path...
<servlet>
<servlet-name>ProvaWebService</servlet-name>
<servlet-class>test.webServices.ProvaWebServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProvaWebService</servlet-name>
<url-pattern>/prova</url-pattern>
</servlet-mapping>
<filter>
<filter-name>Seam Servlet Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamServletFilter</filter-class>
</filter>
Problemi riscontrati:
Se Sommatore è un EJB Stateless o uno dei suoi componenti interni è stateless (@Stateless) l'oggetto non viene inettato e mi da errore sul cast...
Errore-->org.javassist.tmp.java.lang.Object_$$_javassist_0 cannot be cast to......
--------------------------------------
2) Creando il file standard-jaxws-endpoint-config.xml sotto la cartella MetaInf allo stesso livello delle classi compilate
Mettendoci dentro:
<jaxws-config xmlns="urn:jboss:jaxws-config:2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:javaee="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="urn:jboss:jaxws-config:2.0 jaxws-config_2.1.xsd">
<endpoint-config>
<config-name>Seam WebService Endpoint</config-name>
<pre-handler-chains>
<javaee:handler-chain>
<javaee:protocol-bindings>##SOAP11_HTTP</javaee:protocol-bindings>
<javaee:handler>
<javaee:handler-name>SOAP Request Handler</javaee:handler-name>
<javaee:handler-class>org.jboss.seam.webservice.SOAPRequestHandler</javaee:handler-class>
</javaee:handler>
</javaee:handler-chain>
</pre-handler-chains>
</endpoint-config>
</jaxws-config>
e lasciando il codice Java inalterato
Problemi riscontrati:
Il seguente errore-->java.lang.LinkageError: loader constraint violation: loader (instance of org/jboss/mx/loading/UnifiedClassLoader3)
previously initiated loading for a different type with name "javax/xml/soap/SOAPMessage"
Ho scoperto che nel JDK 1.6 esiste una classe SOAPMessage che si trova nel package rt.jar e un'altra nei jar che ho aggiunto io ( senza i quali però nulla funziona) ma non so che provvedimenti prendere...
:muro: :mc:
Ok mi pare sia tutto....
Ora mi inchino davanti alle vostr conoscenze e aspetto :help:
PS Ovviamente se non chiamo componenti SEAM il tutto funziona...
Uso SEAM per un mio progetto e ho ora la necessità di esporre un WebService dalla mia applicazione web.....
Ho letto varie guide in giro per il mondo ma nessuna mi ha portato a un risultato soddisfacente, così chiedo qui, magari qualcuno è già passato per queste strade e puo' aiutarmi...
Espongo 2 modi diversi usati da me per implementare i webSerrvices con SEAM, anche se entrambi hanno presentato dei problemi.
( Jboss 4.0, SEAM 2.0.2, Java 1.6_10)
Intanto in entrambi i casi ho importato il seguenti jar nella cartella ENSORSED di Jboss:
* jaxb-api.jar
* jbossws-native-jaxrpc.jar
* jbossws-native-jaxws.jar
* jbossws-native-jaxws-ext.jar
* jbossws-native-saaj.jar
1) Definendo il WS sul file web.xml:
Ho la mia classe con le annotation
@Name("provaWebServiceImpl")
@Stateless
@SOAPBinding(style = SOAPBinding.Style.RPC)
@WebService
public class ProvaWebServiceImpl implements ProvaWebService{
@WebMethod
public int somma(int x, int y) {
Lifecycle.beginCall();
Sommatore sommatore= (Sommatore ) Component.getInstance("sommatore");
return sommatore.somma(x,y);}
}
e la parte web.xml che mi definisce il path...
<servlet>
<servlet-name>ProvaWebService</servlet-name>
<servlet-class>test.webServices.ProvaWebServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProvaWebService</servlet-name>
<url-pattern>/prova</url-pattern>
</servlet-mapping>
<filter>
<filter-name>Seam Servlet Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamServletFilter</filter-class>
</filter>
Problemi riscontrati:
Se Sommatore è un EJB Stateless o uno dei suoi componenti interni è stateless (@Stateless) l'oggetto non viene inettato e mi da errore sul cast...
Errore-->org.javassist.tmp.java.lang.Object_$$_javassist_0 cannot be cast to......
--------------------------------------
2) Creando il file standard-jaxws-endpoint-config.xml sotto la cartella MetaInf allo stesso livello delle classi compilate
Mettendoci dentro:
<jaxws-config xmlns="urn:jboss:jaxws-config:2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:javaee="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="urn:jboss:jaxws-config:2.0 jaxws-config_2.1.xsd">
<endpoint-config>
<config-name>Seam WebService Endpoint</config-name>
<pre-handler-chains>
<javaee:handler-chain>
<javaee:protocol-bindings>##SOAP11_HTTP</javaee:protocol-bindings>
<javaee:handler>
<javaee:handler-name>SOAP Request Handler</javaee:handler-name>
<javaee:handler-class>org.jboss.seam.webservice.SOAPRequestHandler</javaee:handler-class>
</javaee:handler>
</javaee:handler-chain>
</pre-handler-chains>
</endpoint-config>
</jaxws-config>
e lasciando il codice Java inalterato
Problemi riscontrati:
Il seguente errore-->java.lang.LinkageError: loader constraint violation: loader (instance of org/jboss/mx/loading/UnifiedClassLoader3)
previously initiated loading for a different type with name "javax/xml/soap/SOAPMessage"
Ho scoperto che nel JDK 1.6 esiste una classe SOAPMessage che si trova nel package rt.jar e un'altra nei jar che ho aggiunto io ( senza i quali però nulla funziona) ma non so che provvedimenti prendere...
:muro: :mc:
Ok mi pare sia tutto....
Ora mi inchino davanti alle vostr conoscenze e aspetto :help:
PS Ovviamente se non chiamo componenti SEAM il tutto funziona...