在 resteasy 和 EJB 3.0 中不能转换为 javax.ws.rs.core.Application

cannot be cast to javax.ws.rs.core.Application in resteasy and EJB 3.0

我遇到异常 com.sai.peps.ejb.frequentexceeding.FrequentExceedingBean 无法转换为无法转换为 javax.ws.rs.core.Application

我正在使用 EJB 3.0 和 jboss 5.1 & resteasy

请大家指点一下,我哪里错了

  <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.resources</param-name>
        <param-value>com.sai.peps.ejb.frequentexceeding.MyRestApplication</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/rest/</param-value>
    </context-param>

 <servlet>
        <servlet-name>resteasy-servlet</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.sai.peps.ejb.frequentexceeding.MyRestApplication</param-value>
        </init-param>
    </servlet>  
  <servlet-mapping>
        <servlet-name>resteasy-servlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

已编辑:

package com.sai.peps.ejb.frequentexceeding;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/rest")
public class MyRestApplication extends Application {
    private Set<Object> resourceObjects = new HashSet<Object>();
    private Set<Class<?>> resourceClasses = new HashSet<Class<?>>();

    public  MyRestApplication() {
        resourceClasses.add(FrequentExceedingBean.class);
    }
    @Override
    public Set<Class<?>> getClasses() {
        return resourceClasses;
    }
    @Override
    public Set<Object> getSingletons() {
        return resourceObjects;
    }
}

我已经添加了这段代码..仍然无法正常工作

如果您的 class com.sai.peps.ejb.frequentexceeding.FrequentExceedingBean 应该是配置的应用程序 class,它必须扩展 javax.ws.rs.core.Application 因为 servlet 容器将实例化此 class 然后将 ist 转换为 javax.ws.rs.core.Application 以便能够调用它的 getClasses()getSingletons() 方法。

更新

唉JBoss 5.1 还没有Servlet 3.0.,所以如果没有web.xml.

就不能配置它

请检查 web.xml 文件中所需条目的已接受答案 of this question。 class 名称的配置与您的配置不同。我自己也好久没用web.xml配置了,所以不太坚定

你的 web.xml 看起来有点乱。

问题是:为什么要为应用程序提供自己的实现 class?

如果你有

resteasy.scan = true

您不需要任何其他东西(除了在您的资源和供应商上适当注释 classes 来发布您的资源)。

如果你有

resteasy.resources

使用资源列表进行评估

你可以省略 resteasy.scan 参数并明确提供要发布的资源列表(在这种情况下你输入 com.sai.peps.ejb.frequentexceeding.MyRestApplication 但这是错误的,可能你应该输入 com.sai.peps.ejb.frequentexceeding.FrequentExceedingBean )

您可以覆盖应用程序 class 以将配置移出 web.xml,并且仍然严格控制要使用自定义逻辑发布的资源列表。你确定这是你的需要吗?如果是这种情况,您应该跳过上述配置。

无论如何选择三种方法中的一种