Para injetar beans do Spring em um Web-Service no Glassfish, seja ele JAX-WS ou JAX-RS, pode-se utilizar EJB's configurados com interceptors.
Para configurar um interceptor num EJB, é necessário anotar a classe com
@Stateless @Interceptors(SpringBeanAutowiringInterceptor.class) public class WebService { }
Note que os interceptors funcionam somente com EJB's, então é necessário anotar a classe com @Stateless (@Stateful geralmente não é utilizado em Web-Services).
Além disso, um arquivo XML deve ser criado para que o interceptor possa carregar o Spring Application Context.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- This context is loaded by type and not by name --> <bean class="org.springframework.context.support.ClassPathXmlApplicationContext"> <constructor-arg value="classpath*:application-context.xml" /> </bean> </beans>
Agora falta habilitar a injeção de dependência via annotation, para isso adicione o namespace e a configuração abaixo no application-context.xml.
<beans xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config />
Isso deve ser suficiente para que seja possível injetar beans do Spring no Web-Service utilizando a annotation @Autowire.
@Stateless @Interceptors(SpringBeanAutowiringInterceptor.class) public class WebService { @Autowire @Qualifier("springBean") private SpringBean bean; }
Lembre-se que por padrão, o @Autowire faz um bind por tipo. Caso queira fazê-lo por nome, você deve especificar a annotation @Qualifier para qualificar o bean a ser injetado.