Hoe kan ek toegang tot die ApplicationContext vanuit 'n JAX-WS web diens?
-
03-07-2019 - |
Vra
Net soos href="https://stackoverflow.com/questions/261348/how-can-i-access-the-servletcontext-from-within-a-jax-ws-web-service"> , is daar 'n manier om toegang te verkry applicationContext, makliker as dit?
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;
}
}
Oplossing
Ek dink nie dat die web diens moet hê om te weet oor web of Servlet konteks of die toepassing daarvan konteks. Ek kan nie sien waarom dit behoort te hê om enige van daardie weet. Moet dit nie wees veel meer passiewe? Spuit wat dit nodig het en laat dit sy werk doen. Die diens interaksies met 'n kliënt moet gebaseer wees op 'n kontrak omskryf aan die voorkant. As dit moet onbekende waardes van 'n konteks van 'n soort te kry, hoe sal kliënte weet wat gedoen moet word gestel of hoe om dit te stel?
Ek wil verder gaan en sê dat 'n web diens 'n wrapper vir 'n lente diens koppelvlak moet wees. Dis net nog 'n keuse tussen al die moontlike maniere om dit bloot te stel. Jou web diens moet bietjie meer doen as veiligheidsbeamptes en unmarshal die XML versoek / reaksie voorwerpe en saam te werk met die lente dienste.
Ander wenke
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;
...
}
Maak jou web diens boontjie brei 'n lente boontjie.
soos hierdie
Ek sou 'n Filter wat ServletContext spaar voordat chaining in 'n ThreadLocal installeer
Volgens die Javadoc vir die SpringBeanAutowiringSupport klas, sien: http : //docs.spring.io/autorepo/docs/spring-framework/3.0.x/api/org/springframework/web/context/support/SpringBeanAutowiringSupport.html
Lees die N Nota:. Aan die einde van die javadoc
Die oorspronklike vraag, kan in werklikheid, wees die wyse waarop dit moet geïmplementeer word.