Foro sobre Java EE > Spring no inyecta los beans en un Web Service con Jax-ws
Buenas tardes grupo.
Deseo pedirles su ayuda para resolver un problema que tengo con Spring 4 y tomcat v 9.0. Verán, cuando desde el servicio (WebService1) creo una instancia al objeto Student de forma manual (objStudents = new Students()) para llamar al método getStudent, todo funciona perfectamente, sin embargo, cuando confío en que Spring lo hará pues lo establecí en un archivo de contexto, recibo un error de java.lang.NullPointerException.
El proyecto tienen la siguiente estructura:
Es la Interfaz del servicio principal WebService1: ##########################
@WebService public interface WebService1 { @WebMethod public String getGretting();
}
Es la clase que implementa a la interfaz y define sus métodos, WebService1Impl: ##########################
package com.ws.impl;
import javax.jws.WebService;
import com.services.Students;
@WebService( serviceName="WebService1", endpointInterface="com.ws.WebService1" ) public class WebService1Impl {
public Students objStudents;
public String getGretting(){ return "Hello " + this.objStudents.getStudent(1); }
public Students getObjStudents() { return objStudents; }
public void setObjStudents(Students objStudents) { this.objStudents = objStudents; }
}
De modo que está última llama al servicio de la clase Student: ##########################
package com.services;
public class Students { public String getStudent(int intNum){ String strStudent; switch(intNum){ case 1: strStudent="Abel"; break; case 2: strStudent="Mike"; break; default: strStudent="--"; } return strStudent; } }
Lo que me parece muy raro son estas dos situaciones:
1.- Al ejecutar la aplicación desde el IDE Eclipse en la consola me aparen muchos mensajes logs de Spring, pero uno de los que llama mi atención son los siguientes:
Lo cual me esta diciendo que sí se están creando los beans, pero aún después de ver eso sigo obteniendo el mismo error.
2.- Si coloco un mensaje como System.out.println("Sí entro"), en la clase WebService1Impl dentro del método set (setObjStudents) e inicio el servicio Tomcat (lo despliego), el mensaje es lanzado, lo que significa que Spring si esta creando e inyectando el Beans, pero cuando llamo al servicio desde SOAPUi, vuelvo a obtener el error de java.lang.NullPointerException. Lo que me hace que una vez que esta desplegado el servicio y lo intento consumir desde un cliente los beans viven en un contenedor de beans al que no tengo acceso.
Les agradecería mucho por su respuesta, la verdad ya llevo unos días con esto y no se qué hacer.
P.D. Hay algunos ejemplos de Spring con Jax-ws, pero no los quiero usar por que están basados en archtypes diferentes, yo estor usando Spring boot con http://start.spring.io/.
En el applicationContext deberías tener un bean del webservice y uno de los properties debería ser el bean students, no sé si es que no lo tienes o no lo has puesto completo.
Buenas tardes grupo.
Deseo pedirles su ayuda para resolver un problema que tengo con Spring 4 y tomcat v 9.0. Verán, cuando desde el servicio (WebService1) creo una instancia al objeto Student de forma manual (objStudents = new Students()) para llamar al método getStudent, todo funciona perfectamente, sin embargo, cuando confío en que Spring lo hará pues lo establecí en un archivo de contexto, recibo un error de java.lang.NullPointerException.
El proyecto tienen la siguiente estructura:
Es la Interfaz del servicio principal WebService1: ##########################
package com.ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface WebService1 {
@WebMethod
public String getGretting();
}
Es la clase que implementa a la interfaz y define sus métodos, WebService1Impl: ##########################
package com.ws.impl;
import javax.jws.WebService;
import com.services.Students;
@WebService(
serviceName="WebService1",
endpointInterface="com.ws.WebService1"
)
public class WebService1Impl {
public Students objStudents;
public String getGretting(){
return "Hello " + this.objStudents.getStudent(1);
}
public Students getObjStudents() {
return objStudents;
}
public void setObjStudents(Students objStudents) {
this.objStudents = objStudents;
}
}
De modo que está última llama al servicio de la clase Student: ##########################
package com.services;
public class Students {
public String getStudent(int intNum){
String strStudent;
switch(intNum){
case 1:
strStudent="Abel";
break;
case 2:
strStudent="Mike";
break;
default:
strStudent="--";
}
return strStudent;
}
}
Los descriptores del servicio son los siguientes:
web.xml ##########################
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>SpringWS</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>WebService1</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WebService1</servlet-name>
<url-pattern>/WebService1</url-pattern>
</servlet-mapping>
</web-app>
sun-jaxws.xml ##########################
<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint
name="WebService1"
implementation="com.ws.impl.WebService1Impl"
url-pattern="/WebService1"/>
</endpoints>
El archivo de applicationContext.xml ##########################
<property name="objStudents" ref="Students" />
Y finalmente el pom.xml ##########################
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
SpringWS
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringWS</name>
<description>Web Service SOAP Hola mundofwsdl</description>
<parent>
<groupId>org.springframework.boot</groupId>
spring-boot-starter-parent
<version>1.5.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- JAX-WS -->
<dependency>
<groupId>com.sun.xml.ws</groupId>
jaxws-rt
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.jvnet.jax-ws-commons.spring</groupId>
jaxws-spring
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
spring-boot-starter-web
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
spring-boot-starter-web-services
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
spring-boot-starter-test
<scope>test</scope>
</dependency>
</dependencies>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
spring-boot-maven-plugin
</plugin>
</plugins>
</project>
##############################################################################
Lo que me parece muy raro son estas dos situaciones:
1.- Al ejecutar la aplicación desde el IDE Eclipse en la consola me aparen muchos mensajes logs de Spring, pero uno de los que llama mi atención son los siguientes:
18:01:42.385 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Students'
18:01:42.385 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'Students'
18:01:42.385 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'Students' to allow for resolving potential circular references
18:01:42.387 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'Students'
18:01:42.427 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'WebService1Impl'
18:01:42.427 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'Students'
Lo cual me esta diciendo que sí se están creando los beans, pero aún después de ver eso sigo obteniendo el mismo error.
2.- Si coloco un mensaje como System.out.println("Sí entro"), en la clase WebService1Impl dentro del método set (setObjStudents) e inicio el servicio Tomcat (lo despliego), el mensaje es lanzado, lo que significa que Spring si esta creando e inyectando el Beans, pero cuando llamo al servicio desde SOAPUi, vuelvo a obtener el error de java.lang.NullPointerException. Lo que me hace que una vez que esta desplegado el servicio y lo intento consumir desde un cliente los beans viven en un contenedor de beans al que no tengo acceso.
Les agradecería mucho por su respuesta, la verdad ya llevo unos días con esto y no se qué hacer.
P.D. Hay algunos ejemplos de Spring con Jax-ws, pero no los quiero usar por que están basados en archtypes diferentes, yo estor usando Spring boot con http://start.spring.io/.