来自 JBoss 的 RESTEasy 和 JNDI 数据源

RESTEasy and JNDI datasource from JBoss

我正在尝试使用在我的 JBoss EAP 7 standalone.xml:

中声明的数据源
<datasource jndi-name="java:jboss/datasources/my_db" pool-name="my_db" ...>
...
</datasource>

顺便说一下,我还没有找到任何关于名称约定的文档,java:/datasources/my_db 是否也正确?

然后,一旦我将以下内容添加到我的 RESTEasy web.xml(没有其他修改):

<context-param>
    <param-name>resteasy.jndi.resources</param-name>
    <param-value>java:jboss/datasources/my_db</param-value>
</context-param>

应用程序因错误而中断:

java.lang.RuntimeException: RESTEASY003130: Class is not a root resource.
It, or one of its interfaces must be annotated with @Path:
org.jboss.as.connector.subsystems.datasources.WildFlyDataSource implements:
javax.sql.DataSource java.io.Serializable

如何在 RESTEasy 中访问 JNDI 数据源?
谢谢。

当您 运行 在 WildFly/JBossEAP 7 容器中时,您可以完全忘记它的 JAX-RS 实现是基于 RestEASY 构建的。

您可以完全删除 web.xml(或至少它包含的任何 RestEASY 配置)并只构建 "pure" JAX-RS:

@Path("...")
public class SomeRestService {

    @Resource(name="java:jboss/datasources/my_db")
    private DataSource ds;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public MyPojo someResource() {

        try(Connection con = ds.getConnection()) {
            ...
        }

    }

}

您可以注入 EJB、CDI bean、PersistenceContext 等。它将 "just work"。

史蒂夫的回答是正确的,但还有另一种方法:

DataSource ds = (DataSource) new InitialContext().lookup("java:jboss/datasources/my_db");

我更喜欢使用 @Resource