2016-03-30 15 views
0

Ich versuche, in Weblogic 12c eine Webservice mit den folgenden Anmerkungen zu implementieren:NameAlreadyBoundException, wenn die Verwendung von @Stateless in einem Webservice mit web.xml

@SchemaValidation 
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) 
@WebService(serviceName = "xxxxx", 
     targetNamespace = "http://bla/BusinessServices/yyy/xxxxx/V1", 
     wsdlLocation = "META-INF/wsdl/zzz/yyy/xxxxx/V1/xxxxxConcrete.wsdl", 
     portName = "xxxxxPort", 
     endpointInterface = "ble.businessservices.yyy.xxxxx.v1.xxxxx") 
//@Transactional(value= Transactional.TransactionFlowType.SUPPORTS, version= Transactional.Version.WSAT12) 
@Stateless 
@SecurityPolicies(@SecurityPolicy(uri = "my_policy")) 
@DeclareRoles("my-role") 
@Interceptors({InterceptorClass1.class, InterceptorClass2.class, InterceptorClass3.class}) 
public class xxxxxV1 extends HttpServlet implements xxxxx {...} 

Ich verwende einen web.xml die definieren Servlet-Alias ​​und eine weblogic.xml-Datei zum Definieren des Kontextstammverzeichnisses, das ich verwenden möchte.

Das Problem ist, wenn ich die @Stateless Anmerkung verlassen, wenn Entfalten wir die folgende Ausnahme erhalten:

Target state: deploy failed on Server services_server 
javax.naming.NameAlreadyBoundException: my-webservice-name-impl-1.0.0.0-SNAPSHOT.war#MyWebServiceName is already bound; remaining name 'app/wsee' 
    at weblogic.deploy.api.tools.deployer.Jsr88Operation.report(Jsr88Operation.java:547) 
    at weblogic.deploy.api.tools.deployer.Deployer.perform(Deployer.java:140) 
    at weblogic.deploy.api.tools.deployer.Deployer.runBody(Deployer.java:88) 
    at weblogic.utils.compiler.Tool.run(Tool.java:158) 
    at weblogic.utils.compiler.Tool.run(Tool.java:115) 
    at weblogic.Deployer.run(Deployer.java:74) 
    ... 15 more 

Auf der anderen Seite, wenn ich web.xml löschen, ich ohne Fehler bereitstellen kann, aber natürlich die URL meiner Webservice ist nicht die, die ich definieren wollen: es verwendet die/portName/serviceName URL.

Und wenn ich die @Stateless Annotation löschen, bekomme ich die benötigte URL, aber die Interzeptoren werden ignoriert, was logisch inakzeptabel ist.

Ich habe versucht, mit der @Transactional Annotation (siehe kommentierter Code oben), aber Interzeptoren werden immer ignoriert.

Jeder hat eine Vorstellung davon, was ich fehle? Idealerweise würde ich web.xml und @Transactional verwenden und in die Interzeptoren gelangen.

Danke euch allen!

Antwort

0

Gefunden eine Lösung für alles, was Arbeit als nötig machen: the delegation pattern.

Die WebService-Klasse hat nun folgende Anmerkungen:

@SchemaValidation 
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) 
@WebService(serviceName = "xxxxx", 
     targetNamespace = "http://bla/BusinessServices/yyy/xxxxx/V1", 
     wsdlLocation = "META-INF/wsdl/zzz/yyy/xxxxx/V1/xxxxxConcrete.wsdl", 
     portName = "xxxxxPort", 
     endpointInterface = "ble.businessservices.yyy.xxxxx.v1.xxxxx") 
@Transactional(value= Transactional.TransactionFlowType.SUPPORTS, version= Transactional.Version.WSAT12) 
@SecurityPolicies(@SecurityPolicy(uri = "my_policy")) 
public class xxxxxV1 extends HttpServlet implements xxxxx {...} 

Ich benutze dann einen Delegaten Klasse xxxxxV1Delegate mit den folgenden Anmerkungen:

@Stateless 
@DeclareRoles("my-role") 
@Interceptors({InterceptorClass1.class, InterceptorClass2.class, InterceptorClass3.class}) 
public class xxxxxV1Delegate {...} 

In dieser Klasse alle die Implementierung (im Grunde erfolgt kopieren -pasting, was in der WebService-Klasse und Löschen der @Override s war)

die WebService-Klasse wird INJEC t a xxxxxV1Delegate und enthalten alle @Override Methoden. Jede Methode ruft genau dieselbe Methode in der Delegate-Klasse auf.