泽西与javax Servlet发生冲突

时间:2013-04-16 09:40:30

标签: rest intellij-idea jersey web.xml

我正在使用Jersey和Maven建立一个简单的REST服务。对于大于1.8的Jersey版本,IntelliJ中的web.xml会抛出此错误:

'com.sun.jersey.spi.container.servlet.ServletContainer' is not assignable to 'javax.servlet.Servlet'

有没有人知道如何解决这个问题才能使用最新版本的Jersey?

这是web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     version="2.5">

<display-name>R Proxy</display-name>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/r-proxy-log4j.properties</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Jersey configuration -->
<servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>org.fao.fenix.r.proxy.rest</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

<!-- Jersey configuration -->
<servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

3 个答案:

答案 0 :(得分:2)

对于所有遇到相同问题的人 - 因为你的类路径中没有servlet api。只需将servlet-api依赖项添加到您的项目中,一切都会正常。

答案 1 :(得分:1)

我也在研究这个问题。这是我发现的,希望它可以帮助别人:

  1. 您的web.xml中可能有错误的servlet类。对于Jersey 2.0及更高版本,您应该使用“org.glassfish”组而不是旧的“com.sun.jersey”。 因此,在您的web.xml中,您应该:

    <servlet>
        ...
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    </servlet>
    
  2. 在无意中在同一个项目中使用不同版本的Jersey时,我也遇到过这个问题。我的项目确实通过Maven导入Jersey 1.9软件包,但我的代码编辑器在项目类路径上有不同版本的Jersey。清理你的类路径,重新导入你需要的东西并检查你的泽西岛版本,它可以解决你的问题。

答案 2 :(得分:0)

错误对应于您必须添加com.sun.jersey.spi.container.servlet.ServletContainer

占用的依赖项

enter image description here