Servlet类不是javax.servlet.Servlet

时间:2014-03-28 10:42:19

标签: servlets gwt osgi

我正在开发一个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类,它只使用了一次。

任何人都可以帮助我吗?

非常感谢您提前!! 何

4 个答案:

答案 0 :(得分:0)

如果将javax.servlet包嵌入到包中,通常会发生这种情况。然后jetty将普通的javax.servlet部署为一个bundle,而你的应用程序只看到嵌入式类。所以界面被认为是不同的。

最好的解决方案是不将外部资源嵌入到您的捆绑包中。如果你无法避免它,那么导出并导入javax.servlet包。因此框架可以连接jetty并捆绑到提供包的同一个类加载器。

答案 1 :(得分:0)

  • 使用控制台启动equinox
    • 如果是equinox 3.7.x, -Dosgi.console = 6666
    • 如果是equinox 3.8或更新版本: -Dosgi.console.enable.builtin = true -Dosgi.console = 6666
  • 您将能够远程登录到6666端口
  • 在telnet会话中输入命令: packages javax.servlet
  • 在结果列表中,您将看到该包在OSGi容器中多次可用。当你的wab连接到另一个时,泽西连接到其中一个。尝试在容器中只使用包装。

答案 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"})后,我停止了此异常。希望这会有所帮助。