Printemps de Démarrage registre JAX-WS webservice de fèves
Dans mon printemps de démarrage ws en fonction de l'application, j'ai créé un jax-ws webservice à la suite d'un contrat première approche. Le service Web est en place mais je ne peux pas autowire mes autres haricots à l'intérieur de mon webservice.
Comment puis-je définir mon webservice au printemps de fèves?
Qui suit est mon webservice impl classe
@WebService(endpointInterface = "com.foo.bar.MyServicePortType")
@Service
public class MySoapService implements MyServicePortType {
@Autowired
private MyBean obj;
public Res method(final Req request) {
System.out.println("\n\n\nCALLING.......\n\n" + obj.toString()); //obj is null here
return new Res();
}
}
MyServicePortType est geneated par maven à partir du fichier wsdl
Quand j'ai appeler ce service (via SoapUi) il donne des NullPointerException comme le MyBean objet n'est pas autocâblés.
Depuis mon application est construite sur le Printemps de démarrage, il n'existe pas de fichier xml. Actuellement, j'ai sun-jaxws.xml
fichier avec la configuration des ordinateurs d'extrémité. Comment puis-je faire à la suite de la configuration au printemps de démarrage de l'application
<wss:binding url="/hello">
<wss:service>
<ws:service bean="#helloWs"/>
</wss:service>
</wss:binding>
Qui suit est mon SpringBootServletInitializer classe
@Configuration
public class WebXml extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
return application.sources(WSApplication.class);
}
@Bean
public ServletRegistrationBean jaxws() {
final ServletRegistrationBean jaxws = new ServletRegistrationBean(new WSServlet(), "/jaxws");
return jaxws;
}
@Override
public void onStartup(final ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.addListener(new WSServletContextListener());
}
}
grâce
OriginalL'auteur amique | 2014-08-07
Vous devez vous connecter pour publier un commentaire.
L'extension de
SpringBeanAutowiringSupport
est la méthode recommandée pour obtenir des haricots injecté pour JAX-WS point de terminaison de la classe, à partir de l'actuel printemps racine de contexte d'application web. Toutefois, cela ne fonctionne pas avec printemps de démarrage que c'est un peu différent sur initialisation du contexte de la servlet.Problème
SpringBootServletInitializer.startup()
utilise un customContextLoaderListener
et ne passe pas le créé le contexte de l'application deContextLoader
. Plus tard, lorsque l'objet de JAX-WS point de terminaison de la classe en cours d'initialisation,SpringBeanAutowiringSupport
dépendContextLoader
pour récupérer l'actuel contexte de l'application, et de toujours obtenirnull
.Solution de contournement
Il pourrait enregistrer un haricot qui implémente
org.springframework.boot.context.embedded.ServletContextInitializer
pour récupérer le contexte de l'application au cours destartup()
.Ensuite, vous pouvez mettre en œuvre l'auto-permettra à l'autowiring dans votre JAX-WS point de terminaison de la classe.
Tests Unitaires
Dans les tests unitaires vous pourriez obtenir de l'actuel printemps contexte de l'application de l'injection, et l'appel de rechange constructeur.
Mon code fonctionne comme prévu, mais les tests unitaires ne sont pas. pouvez-vous l'aider à surmonter cela. En cas de Test JUNIT il est en train de jeter des NPE à currentContext
Il ne fonctionne pas dans junit que c'réponses sur Servlet Initialisation du Contexte, j'ai mis à jour la réponse comment je les traiter dans des tests unitaires.
merci pour l'aide rapide et cela a fonctionné comme prévu.
Après avoir passé toute la journée j'ai trouvé votre solution idéale. Merci
OriginalL'auteur Parker Wang
Vous n'avez pas à prolonger votre Configuration de SpringBootServletInitializer, ni remplacer configurer() ou onStartup() méthodes. Et en aucun cas, vous avez à construire quelque chose de la mise en œuvre de WebApplicationInitializer. Il y a seulement quelques étapes à faire (vous pouvez également faire de toutes les étapes dans un autre @Configuration de la classe, la classe avec @SpringBootApplication seulement besoin de savoir, où celui-ci est - par exemple via @ComponentScan).
Fait.
Cette solution doit être approuvée officiellement.
OriginalL'auteur jonashackt
Par défaut Printemps ne sais rien à propos de votre JAX-WS postes clients, ils sont gérés par JAX-WS d'exécution plutôt que de Printemps. Vous pouvez résoudre ce problème en utilisant SpringBeanAutowiringSupport Vous devez généralement faire tout simplement par le sous-classement:
Vous avez également la possibilité d'appeler directement à partir d'une méthode annotée avec
@PostConstruct
:À l'aide de CXF comme perfollowing github.com/vanioinformatika/spring-boot-cxf-integration-example le problème est réglé.
ce n'est pas de travail dans sring-boot 1.4, il travaille avec l'approche spécifié par Parker, est-il une solution standard à cela?
OriginalL'auteur Andy Wilkinson
De prendre la moindre idée de @Andy Wilkinson à l'aide de SpringBeanAutoWiringSupport est atteint par l'utilisation de
Vous avez également la possibilité d'appeler directement à partir d'une méthode annotée avec
@PostConstruct
:OriginalL'auteur rajadilipkolli