编辑:在认为这是NetBeans 7.0编辑器错误之后。它仍然可以编译并且可以部署。
我想将我的web服务@WebService; @Stateless实现转换为@Singleton bean但是当我用@Singleton注释替换@WebService时...我在IDE编辑器中得到了下面的图像
当然,当我做一些愚蠢的事情,比如同时拥有@WebService和@Stateless并部署在glassfish中我得到:
严重错误:注释处理失败...
下面是一个链接(还有更多,但我现在仅限于两个链接),这让我相信Singleton bean可以按照我尝试使用它的方式使用。
http://download.oracle.com/javaee/6/tutorial/doc/gipjg.html
“Singleton会话bean提供与无状态会话bean类似的功能,但与它们的不同之处在于每个应用程序只有一个单独的会话bean,而不是无状态会话bean池,其中任何一个都可以响应客户端请求。与无状态会话bean一样,单例会话bean可以实现Web服务端点。“
此链接可能暗示编译器中存在一个错误,该错误已在jboss环境中修复。我不确定这个问题是否相关,并且很想听听有经验的用户的想法。 ;)
https://issues.jboss.org/browse/EJBTHREE-2161
这是glassfish 3.1的输出
信息:关闭Metro监控根: AMX:PP = /月/服务器纹[服务器],类型= WSEndpoint,名称= soco.ws.bb.bearBearWS-BearBearImplPort INFO:EJB StateBean的可移植JNDI名称: 【JAVA:全球/ BearBearService / StateBean soco.ws.bb.StateBean, java:global / BearBearService / StateBean] INFO:Metro监控根名称 成功设置为: AMX:PP = /月/服务器纹[服务器],类型= WSEndpoint,名称= soco.ws.bb.bearBearWS-BearBearImplPort 警告:容器org.glassfish.webservices.JAXWSContainer@249ef1e 不支持类com.sun.xml.ws.api.server.Module INFO:Portable EJB BearBearImpl的JNDI名称: 【JAVA:全球/ BearBearService / BearBearImpl soco.ws.bb.BearBearWS, java:global / BearBearService / BearBearImpl] INFO:WS00019:EJB端点 部署
这是glassfish 3.0.1的输出
信息:Metro监控rooname成功设置为: amx:pp = / mon / server-mon [server],type = WSEndpoint, name = AppleImplService-AppleImplPort警告:容器 org.glassfish.webservices.JAXWSContainer@191f81e不支持类 com.sun.xml.ws.api.server.Module INFO:EJB的可移植JNDI名称 AppleImpl“ 【JAVA:全球/ AppleService / AppleImpl com.ws.srv.MyService,JAVA:全球/ AppleService / AppleImpl] 信息:WS00019:EJB端点部署AppleService监听 地址http://localhost:8080/AppleImplService/AppleImpl INFO: AppleService已在438毫秒内成功部署
答案 0 :(得分:2)
正如@bkail指出的那样,JSR 109明确允许@WebService
和@Singleton
的组合。 Chapter 3.3.1州:
3.3.1网络服务组件
此规范定义了两种实现Web服务的方法,该方法在Java EE环境中运行,但不会将Web服务实现仅限于这些方法。第一个是基于容器的JAX-RPC或JAX-WS编程模型的扩展,它将Web服务定义为在Web容器中运行的Java类。第二种方法是在EJB容器中使用无状态会话EJB或单例会话EJB (仅适用于JAX-WS服务)的约束实现。其他服务实现是可能的,但本规范未对其进行定义。
解决方法可能是在Web Services类中使用@Singleton
带注释的成员属性,然后委托给此单例:
@WebService
public class MyService {
@EJB
private MySingleton singleton;
public void doSomeService() {
this.singleton.doSomeService();
}
}
@Singleton
public class MySingleton {
// some code ...
}
答案 1 :(得分:2)
这是NetBeans 7.0编辑器中的错误。我能够使用@WebService,@ Singleton构建和部署WS,即使服务名称用红色加下划线表示编译错误。只是运行一个测试来验证spec bean是否像宣传的那样工作。我将在下面提供代码和我的测试ui的快照。
感谢@home,@ bkali和@Preston的贡献。
提交给netbeans作为错误:http://netbeans.org/bugzilla/show_bug.cgi?id=200911
请注意,在我将服务重新部署为Singleton而不是无状态时,实例状态会超时,并在超时期限(10分钟)后从50更改为0。
Web服务测试代码:
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.jws.WebService;
import javax.jws.WebParam;
import javax.ejb.Stateless;
@WebService(serviceName = "soco.ws.bb.bearBearWS")
@Singleton
//@Stateless
public class BearBearImpl implements BearBearWS {
int state = 0;
static int staticState = 0;
@EJB StateBean sb = new StateBean();
@Override
public String hello(@WebParam(name = "name") String txt) {
return "Hello " + txt + " !";
}
@Override
public void setAllState(int in) {
System.out.println("setting instance state from "+state+" to "+in);
state = in;
System.out.println("setting static state from "+staticState+" to "+in);
staticState = in;
System.out.println("setting singleton state from "+sb.state+" to "+in);
sb.state = in;
}
@Override
public int getInstanceState() {
System.out.println("returning instance state "+state);
return state;
}
@Override
public int getStaticState() {
System.out.println("returning static state "+staticState);
return staticState;
}
@Override
public int getSingletonState() {
System.out.println("returning singleton state "+sb.state);
return sb.state;
}
}