当前位置: 首页 > 面试题库 >

Java将EJB注入JAX-RS(RESTful服务)

康锦
2023-03-14
问题内容

我试图通过注释将无状态EJB注入到JAX-RS Web服务中。不幸的是,EJB是正义的nullNullPointerException当我尝试使用它时我得到了。

@Path("book")
public class BookResource {

    @EJB
    private BookEJB bookEJB;

    public BookResource() {
    }

    @GET
    @Produces("application/xml")
    @Path("/{bookId}")
    public Book getBookById(@PathParam("bookId") Integer id)
    {
        return bookEJB.findById(id);
    }
}

我究竟做错了什么?

以下是有关我的机器的一些信息:

  • Glassfish 3.1
  • Netbeans 6.9 RC 2
  • Java EE 6

你们能举个可行的例子吗?


问题答案:

我不确定这是否行得通。所以:

选项1:使用注入提供程序SPI

实现一个提供程序,它将执行查找并注入EJB。看到:

@EJB注入。

com.sun.jersey:jersey-server:1.17的示例:

import com.sun.jersey.core.spi.component.ComponentContext;
import com.sun.jersey.core.spi.component.ComponentScope;
import com.sun.jersey.spi.inject.Injectable;
import com.sun.jersey.spi.inject.InjectableProvider;

import javax.ejb.EJB;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.ws.rs.ext.Provider;
import java.lang.reflect.Type;

/**
 * JAX-RS EJB Injection provider.
 */
@Provider
public class EJBProvider implements InjectableProvider<EJB, Type> {

    public ComponentScope getScope() {
        return ComponentScope.Singleton;
    }

    public Injectable getInjectable(ComponentContext cc, EJB ejb, Type t) {
        if (!(t instanceof Class)) return null;

        try {
            Class c = (Class)t;
            Context ic = new InitialContext();

            final Object o = ic.lookup(c.getName());

            return new Injectable<Object>() {
                public Object getValue() {
                    return o;
                }
            };
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

选项2:使BookResource成为EJB

@Stateless
@Path("book")
public class BookResource {

    @EJB
    private BookEJB bookEJB;

    //...
}

看到:

如何将REST服务与EJB 3.1结合
EJB 3.1和REST-轻量级混合
选项3:使用CDI

@Path("book")
@RequestScoped
public class BookResource {

    @Inject
    private BookEJB bookEJB;

    //...
}


 类似资料:
  • JAX-RS API提供以下注解可在java中开发RESTful应用程序。 下面我们将使用 jersey 实现来开发JAX-RS示例。首先打开Eclipse,创建一个动态Web项目:JaxrsWeb。 Jersey Jar文件下载网址:https://jersey.github.io/download.html 1. JAX-RS注释 javax.ws.rs 包中包含JAX-RS注释。 注解 描述

  • 泽西-客户端 泽西-普通 jersey-container-servlet jersey-container-servlet-core 泽西-服务器 如果我这样做,我总是得到以下异常: 经过一些研究,我发现我应该添加jersey-servlet-1.12.jar,而不是从上面发布的下载源添加jar。所以我做了。我将其添加到web.xml中

  • 你好,我曾与JAX-WS合作开发基于SOAP的网络服务。现在我想使用REST,因为正如我从这里学习的那样,REST比SOAP有优势。 但从不同的文章中,我知道我们也可以从JAX-WS创建RESTful Web服务。但是大多数人说我们应该使用JAX-RS而不是JAX-WS。 我的问题是JAX-WS RESTful webservice和JAX-RS(泽西)之间有什么区别。JAX-RS相对于JAX-W

  • 我尝试构建一个带有Rest服务和EJB注入的Java EE7应用程序。我创建了一个多模块maven项目,并将其部署在Glassfish 4上。我最后一个EAR包含一个带有EJB的JAR,例如,带有我的Rest服务定义: 当我部署我的应用程序时,我看到下面的日志似乎还可以。即使我想知道它为什么定义“java:global”JNDI,因为默认情况下@Stateless EJB是@local: 编辑1:

  • 问题内容: 我在下面有这样的设置。这是一个简化的版本,但我认为它已涵盖了基本思想。我正在使用Jersey 2.16,Java 1.8和Glassfish Open Source 4.1 但是,当我部署并尝试访问Web服务时,我从安全上下文中得到了NullPointer异常。似乎根本没有注入上下文。我检查了这是secContext变量本身,而不仅仅是从getUserPrincipal()返回的nul

  • 我试图将资源的实例注入具有Singleton作用域的JAX-RS应用程序,但当我这样做时,我得到: 警告:在服务器运行时中注册的提供程序com.test.jersey.app.MyResource未实现任何适用于服务器运行时的提供程序接口。由于约束配置问题,将忽略提供程序com.test.jersey.app.MyResource。 我有一个如下的应用程序,它需要一个已经运行的MyResource