我正在开发一个GWT应用程序,但是当我将它部署到Equinox-jetty服务器时,我得到以下异常:
404 Servlet class com.cartif.gui.autentication.server.AppServiceImpl is not a javax.servlet.Servlet <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error 404 Servlet class com.cartif.gui.autentication.server.AppServiceImpl is not a javax.servlet.Servlet</title>
</head>
<body><h2>HTTP ERROR 404</h2>
<p>Problem accessing /baasGUIAutentication/baasgui/autentication. Reason:
<pre>
Servlet class com.cartif.gui.autentication.server.AppServiceImpl is not a javax.servlet.Servlet</pre></p><h3>Caused by:</h3><pre>javax.servlet.UnavailableException: Servlet class com.cartif.gui.autentication.server.AppServiceImpl is not a javax.servlet.Servlet
at org.mortbay.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:362)
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:243)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.springframework.osgi.web.deployer.jetty.JettyWarDeployer.startWebAppContext(JettyWarDeployer.java:210)
at org.springframework.osgi.web.deployer.jetty.JettyWarDeployer.startDeployment(JettyWarDeployer.java:122)
at org.springframework.osgi.web.deployer.support.AbstractWarDeployer.deploy(AbstractWarDeployer.java:93)
at org.springframework.osgi.web.extender.internal.activator.WarLoaderListener$DeploymentManager$DeployTask.doRun(WarLoaderListener.java:257)
at org.springframework.osgi.web.extender.internal.activator.WarLoaderListener$DeploymentManager$BaseTask.run(WarLoaderListener.java:215)
at org.springframework.scheduling.timer.DelegatingTimerTask.run(DelegatingTimerTask.java:66)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
</pre>
<hr /><i><small>Powered by Jetty://</small></i><br/>
AppServiceImpl类的代码头是:
public class AppServiceImpl extends RemoteServiceServlet implements AppService
和AppService:
@RemoteServiceRelativePath("autentication")
public interface AppService extends RemoteService {
User getUser(String user, String pass) throws Exception;
}
此外,web.xml声明servlet如下:
<servlet>
<servlet-name>baasguiServlet</servlet-name>
<servlet-class>com.cartif.gui.autentication.server.AppServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>baasguiServlet</servlet-name>
<url-pattern>/baasgui/autentication</url-pattern>
</servlet-mapping>
baasgui是编译GWT Java代码的文件夹。我还检查了javax.servlet类,它只使用了一次。
任何人都可以帮助我吗?
非常感谢您提前!! 何
答案 0 :(得分:0)
如果将javax.servlet包嵌入到包中,通常会发生这种情况。然后jetty将普通的javax.servlet部署为一个bundle,而你的应用程序只看到嵌入式类。所以界面被认为是不同的。
最好的解决方案是不将外部资源嵌入到您的捆绑包中。如果你无法避免它,那么导出并导入javax.servlet包。因此框架可以连接jetty并捆绑到提供包的同一个类加载器。
答案 1 :(得分:0)
答案 2 :(得分:0)
我得到了解决方案。在GWT库包中,我必须添加以下行:
Bundle-SymbolicName: gwtlibraries; singleton:=true
Require-Bundle: javax.servlet
标签Require-Bundle和singleton bundle的一部分,而不是导入包。同样在GUI清单中,我不得不添加下一行:
Bundle-SymbolicName: GUI; singleton:=true
Require-Bundle: gwtlibraries //apart from importing the specific libraries
Eclipse-RegisterBuddy: com.cartif.gwt
Eclipse-BuddyPolicy: registered
我部署的GWT库的先前版本没有发生这种情况,但是捆绑结构不同,因为现在我使用的是解压缩的库,而在之前的版本中使用压缩的jar文件。
感谢您的合作和帮助!!!!
答案 3 :(得分:0)
这是我得到这个例外的一个相当普通的原因。我从一个旧的servlet改编了我的新servlet。在.java文件中的类定义正上方,有一行:@WebServlet(name="OldServlet",urlPatterns={"/OldServlet"})
。虽然我已经将我的类从OldServlet正确地重命名为NewServlet(在java和web.xml文件中),但我忘了在上面的行中更改名称。将上面的行更改为@WebServlet(name="NewServlet",urlPatterns={"/NewServlet"})
后,我停止了此异常。希望这会有所帮助。