Wie kann ich auf der Application aus einem JAX-WS Web Service?
-
03-07-2019 - |
Frage
Ähnlich wie Wie kann ich die ServletContext aus einem JAX-WS Web-Service zugreifen? , ist es eine Möglichkeit, application zuzugreifen, einfacher als das?
import javax.annotation.Resource;
import javax.jws.WebService;
import javax.servlet.ServletContext;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
@WebService
public class MyWebService {
// boilerplate code begins :(
@Resource
private WebServiceContext context;
private WebApplicationContext webApplicationContext = null;
/**
* @return
* @throws IllegalStateException
*/
private WebApplicationContext getWebApplicationContext()
throws IllegalStateException {
if (webApplicationContext != null)
return webApplicationContext;
ServletContext servletContext =
(ServletContext) context.getMessageContext().get(
MessageContext.SERVLET_CONTEXT);
webApplicationContext =
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
return webApplicationContext;
}
}
Lösung
Ich glaube nicht, dass der Web-Service weiß über Web oder Servlet-Kontexte oder dessen Anwendungskontext müssen sollte. Ich sehe nicht, warum es sollte irgendetwas davon wissen müssen. Sollte es nicht weit mehr passiv sein? Injizieren, was er braucht und lassen Sie es seine Arbeit tun. Die Service-Interaktionen mit einem Kunden sollten vorne definiert auf einem Vertrag beruht. Ist dies der Fall unbekannte Werte von einem Zusammenhang von einer Art zu erhalten, wie werden die Kunden wissen, was eingestellt werden muss, oder, wie es eingerichtet?
Ich würde noch weiter gehen und sagen, dass ein Web-Service ein Wrapper für eine Frühlings-Service-Schnittstelle sein sollte. Es ist nur noch eine Wahl unter allen möglichen Möglichkeiten, es zu belichten. Ihr Web-Service sollte wenig mehr tun, als Marschall und entpacken Sie die XML Request / Response-Objekte und die Zusammenarbeit mit Feder Service.
Andere Tipps
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
@WebService(
endpointInterface = "Bla",
targetNamespace = "http://bla/v001",
wsdlLocation = "WEB-INF/wsdl/bla.wsdl",
serviceName = "BlaService",
portName = "BlaPort")
public class BlaWs extends SpringBeanAutowiringSupport implements BlaPort {
@Autowired
@Qualifier("dao")
private Dao dao;
...
}
Machen Sie Ihre Web-Service-Bohne eine Feder Bohne erweitern.
würde ich einen Filter installieren, die ServletContext speichert, bevor in einem Threadverkettungs
Nach der JavaDoc für die SpringBeanAutowiringSupport Klasse finden Sie unter: http : //docs.spring.io/autorepo/docs/spring-framework/3.0.x/api/org/springframework/web/context/support/SpringBeanAutowiringSupport.html
Lesen Sieden. HINWEIS: am Ende des javadoc
Die ursprüngliche Frage, kann in der Tat kann die Art und Weise, dass diese umgesetzt werden sollen.