Доступ к объекту @SessionScoped из аннотированного EJB @WebService

Один из моих партнеров нуждается в SOAP-интерфейсе, поэтому я подумал: перейдите на сервер приложений. Я выбрал Glassfish, и он отлично работает из коробки. Есть только одна вещь, которую я не могу сделать: введи @SessionScoped ManagedBean в аннотированный EJB @Webservice.

Единственный способ, которым я могу получить EJB, - это над JNDI. Я читал об этом здесь

Мой вопрос: есть ли ошибка в Glassfish, и он будет работать в будущей версии или должен ли он работать, и я сделал что-то не так.

Я хотел бы иметь возможность вводить DataAccess session свойства с @EJB аннотации @EJB но он не работает.

Ниже приведены все файлы в тестовом проекте

Вот мой класс WebService:

@LocalBean
@Stateless
@WebService()
public class MySOAP implements Serializable { private DataAccess session; @WebMethod public String getUsername() { javax.naming.Context ctx = null; try { ctx = new javax.naming.InitialContext(); session = ( DataAccess ) ctx.lookup( "java:comp/env/DataAccess" ); return "user is " + session.getData(); } catch ( NamingException e ) { e.printStackTrace(); } return "exception occured"; }
}

EJB я хотел бы добавить:

public abstract class AbstractDataBean { @Inject /* this just returns some text*/ private MySessionBean session; public MySessionBean getSession() { return session; }
}
@LocalBean
@Stateless
public class DataAccess extends AbstractDataBean implements Serializable { public String getData() { return " data " + getSession(); } @Override public String toString() { return getData(); }
}
@Named
@SessionScoped
public class MySessionBean implements Serializable { static private int classCounter = 0; private String user; @PostConstruct public void initMySessionBean( ) { user = "Micha " + (++classCounter) ; //to check how many times it was called } public String getUser() { return user; } public void setUser( String user ) { this.user = user; } @Override public String toString() { return user; }
}

У меня есть web.xml для определения JNDI:

<!--?xml version="1.0" encoding="UTF-8"?-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <session-config> <session-timeout>1</session-timeout> </session-config> <ejb-local-ref> <ejb-ref-name>DataAccess</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <local>ch.sertal.server.services.ejb.DataAccess</local> </ejb-local-ref>
</web-app>

sun-jaxws.xml, чтобы определить SOAP WebService:

<!--?xml version="1.0" encoding="UTF-8"?-->
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> </endpoints>

и пустой beans.xml для функционирования CDI:

и, наконец, pom.xml Это очень долго, потому что я скопировал его из существующего проекта. Но ничего не должно быть.

<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/maven-v4_0_0.xsd"> <modelversion>4.0.0</modelversion> <groupid>ch.sertal</groupid> <artifactid>VisionWeb</artifactid> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>VisionWeb Jersey Webapp</name> <build> <finalname>VisionWeb</finalname> <resources> <resource> <filtering>true</filtering> <directory>src/main/resources</directory> <targetpath>META-INF</targetpath> <includes> <include>*.xml</include> </includes> </resource> <resource> <filtering>true</filtering> <directory>src/main/resources</directory> <targetpath>.</targetpath> <includes> <include>*.properties</include> </includes> </resource> <resource> <filtering>true</filtering> <directory>src/main/resources/i18n</directory> <targetpath>.</targetpath> <includes> <include>*.properties</include> </includes> </resource> </resources> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-compiler-plugin</artifactid> <inherited>true</inherited> <configuration> 1.6 <target>1.6</target> </configuration> </plugin> <plugin> <groupid>org.glassfish.maven.plugin</groupid> <artifactid>maven-glassfish-plugin</artifactid> <version>2.1</version> <configuration> <glassfishdirectory>/Development/glassfish3</glassfishdirectory> <user>admin</user> <adminpassword>U36c9AqVf5Ppk4DX</adminpassword> <autocreate>true</autocreate> <debug>true</debug> <echo>false</echo> <terse>true</terse> <skip>false</skip> <domain> <host>${glassfish.host}</host>> <name>domain1</name> <adminport>4848</adminport> <httpport>9080</httpport> <httpsport>8181</httpsport> <iiopport>3700</iiopport> <jmsport>7676</jmsport> </domain> <components> <component> <name>VisionWeb</name> <artifact>${project.build.directory}/${project.build.finalName}.war</artifact> </component> </components> </configuration> </plugin> <!--surefire--> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-surefire-plugin</artifactid> <version>2.9</version> <configuration> <parallel>test</parallel> <threadcount>1</threadcount> <groups>${test.groups}</groups> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupid>org.jboss.weld</groupid> <artifactid>weld-api</artifactid> <version>1.1.Final</version> </dependency> <dependency> <groupid>javax.servlet</groupid> <artifactid>javax.servlet-api</artifactid> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupid>javax</groupid> <artifactid>javaee-api</artifactid> <version>6.0</version> </dependency> <!--jersey for RESTful services--> <dependency> <groupid>com.sun.jersey</groupid> <artifactid>jersey-server</artifactid> <version>${jersey-version}</version> </dependency> <dependency> <groupid>com.sun.jersey</groupid> <artifactid>jersey-json</artifactid> <version>${jersey-version}</version> </dependency> <dependency> <groupid>com.sun.jersey</groupid> <artifactid>jersey-client</artifactid> <version>${jersey-version}</version> <scope>test</scope> </dependency> <dependency> <groupid>com.sun.jersey.contribs</groupid> <artifactid>jersey-multipart</artifactid> <version>${jersey-version}</version> </dependency> <!--GlassFish libraries--> <dependency> <groupid>org.glassfish.distributions</groupid> <artifactid>web-all</artifactid> <version>10.0-build-20080430</version> <scope>test</scope> </dependency> <dependency> <groupid>org.glassfish.embedded</groupid> <artifactid>gf-embedded-api</artifactid> <version>1.0-alpha-4</version> <scope>test</scope> </dependency> <!--peristence & database--> <!-- hsqldb --> <dependency> <groupid>org.hsqldb</groupid> <artifactid>hsqldb</artifactid> <version>2.2.6</version> </dependency> <!-- persistence --> <dependency> <groupid>org.eclipse.persistence</groupid> <artifactid>eclipselink</artifactid> <version>${eclipselink.version}</version> <scope>compile</scope> </dependency> <dependency> <groupid>org.eclipse.persistence</groupid> <artifactid>javax.persistence</artifactid> <version>${eclipselink.jpa.version}</version> <scope>compile</scope> </dependency> <!--SHIRO Authentication--> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-core</artifactid> <version>1.1.0</version> </dependency> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-web</artifactid> <version>1.1.0</version> </dependency> <!--POI components--> <dependency> <groupid>org.apache.poi</groupid> <artifactid>poi</artifactid> <version>3.7</version> </dependency> <!--PDF Box--> <dependency> <groupid>org.apache.pdfbox</groupid> <artifactid>pdfbox</artifactid> <version>1.6.0</version> </dependency> <!--XML processing--> <dependency> <groupid>dom4j</groupid> <artifactid>dom4j</artifactid> <version>1.6.1</version> </dependency> <!--testing--> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.8.2</version> <scope>test</scope> </dependency> <dependency> <groupid>org.testng</groupid> <artifactid>testng</artifactid> <version>6.0.1</version> <scope>test</scope> </dependency> </dependencies> <!--properties--> <properties> <jersey-version>1.8</jersey-version> <jpa.unit>hsqldb.server</jpa.unit> <test.jpa.unit>hsqldb.testr</test.jpa.unit> <eclipselink.version>2.3.0</eclipselink.version> <eclipselink.jpa.version>2.0.3</eclipselink.jpa.version> </properties> <!--profiles--> <profiles> <profile> <id>mode.alpha.dev</id> <activation> <activebydefault>false</activebydefault> <property> <name>environment</name> <value>server</value> </property> </activation> <properties> <delete.files>true</delete.files> <log.level>FINER</log.level> <jersey.log.level>WARNING</jersey.log.level> <jpa.log.level>INFO</jpa.log.level> <test.groups>server-tests</test.groups> <db.server.name>localhost</db.server.name> <img-basedir>/opt/sertal/data</img-basedir> <!--the url for tomcat 7 has changed. this is why /html has been appended to the below URL--> <tomcat.manager>http://dev.sertal.net:7070/manager/html</tomcat.manager> <tomcat.username>sertaladmin</tomcat.username> <tomcat.password>29VeK0Ul</tomcat.password> <tomcat.context>/VisionWeb</tomcat.context> <test.groups>none</test.groups> <!-- the date at the end marks the version of the data model --> <hsqldb.data.path>/opt/sertal/data/hsqldb-dev-20110813</hsqldb.data.path> </properties> </profile> </profiles> <!--repositories and plugin repos--> <repositories> <!--glass fish--> <repository> <id>glassfish.java.net</id> <name>GlassFish Maven Repository</name> <url>http://download.java.net/maven/glassfish</url> <layout>default</layout> </repository> <repository> <id>m2.java.net</id> <name>Java.net Maven 2 Repository</name> <url>http://download.java.net/maven/2</url> <layout>default</layout> </repository> <!--eclipse link--> <repository> <id>eclipselink.repo</id> <name>eclipselink maven repository</name> <url>http://download.eclipse.org/rt/eclipselink/maven.repo</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginrepositories> <pluginrepository> <id>m2.java.net</id> <name>Java.net Maven 2 Repository</name> <url>http://download.java.net/maven/2</url> <layout>default</layout> </pluginrepository> <pluginrepository> <id>jboss-public-repository-group</id> <name>JBoss Public Maven Repository Group</name> <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url> <layout>default</layout> <releases> <enabled>true</enabled> <updatepolicy>never</updatepolicy> </releases> <snapshots> <enabled>true</enabled> <updatepolicy>never</updatepolicy> </snapshots> </pluginrepository> </pluginrepositories>
</project>

Позаботьтесь о совете, я не переключусь на JBoss :-)

1 ответ

Сфера сеанса не активна для веб-производных в разделе 6.7.2 JSR 299, это не ошибка. Если вы думаете об этом, нет смысла, поскольку сеанс действительно не следует из одного запроса веб-службы к другому.

Кроме того, вы сказали, что не переключитесь на JBoss, из любопытства, каковы ваши причины?

licensed under cc by-sa 3.0 with attribution.