1

我正在尝试将 DataSource 注入 TomEE [ Apache Tomcat (TomEE)/9.0.20 (8.0.0-M3 ] 中的 ContainerRequestFilter。但是,无论我做什么,我都会遇到错误。

我看到 JNDI 名称正在通过以下方式在 TomEE 中注册:

org.apache.openejb.assembler.classic.Assembler.createRecipe Creating Resource(id=jdbc/auth/ReadDataSource)

但即使当我通过 InitialContext 手动查找 DataSource 时,我也会在查找时出错。例如,这是我的示例过滤器:

@Provider
@PreMatching
public class MyFilter implements ContainerRequestFilter {

    DataSource dataSource;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        try {
            InitialContext initialContext = new InitialContext();
            dataSource = (DataSource)initialContext.lookup("jdbc/auth/ReadDataSource");
        } catch (NullPointerException | NamingException e) {
            Response response = Response
                .status(Status.INTERNAL_SERVER_ERROR)
                .entity(e.getMessage())
                .build();
            requestContext.abortWith(response);
        }
    }
}

不幸的是,我收到以下错误:

Name [jdbc/auth/ReadDataSource] is not bound in this Context. Unable to find [jdbc]

我能做些什么?我一直在研究如何解决我的问题,我看到的很多都是泽西岛特定的解决方案。但是,我使用 TomEE,它的 JAX-RS 实现是 Apache CXF 1。因此,除非我更改 JAX-RS 实现,否则球衣解决方案将不起作用,但这对于琐事来说似乎有点过头了。

任何帮助将不胜感激。

谢谢。

4

2 回答 2

0

java:comp/env/为您的 JNDI 名称添加前缀:

... initialContext.lookup("java:comp/env/jdbc/auth/ReadDataSource");
于 2019-09-14T21:10:45.437 回答
0

我最终做的是通过初始上下文查找 EJB 并让 EJB 注入资源。例如,在我的过滤器中,这有效:

            Properties p = new Properties();
            p.put("java.naming.factory.initial", "org.apache.openejb.client.LocalInitialContextFactory");
            InitialContext ic = new InitialContext(p);
            Hello hellpEJB = (Hello)ic.lookup("HelloImplLocal");

在 EJB 中,我可以通过以下方式轻松注入资源:

    @Resource(name="jdbc/auth/ReadDataSource")
    DataSource dataSource;

    @Override
    public String sayHello() {
        try {
            Connection connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return "Hello from EJB";
    }

一切正常!

于 2019-09-14T22:12:13.663 回答