Внедрение ресурса в javax.ws.rs.container.ContainerRequestFilter в TomEE 8

Я пытаюсь внедрить DataSource в ContainerRequestFilter в TomEE [Apache Tomcat (TomEE)/9.0.20 (8.0.0-M3]. Однако независимо от того, что я делаю, возникают ошибки. .

Я вижу, что имя JNDI регистрируется в TomEE через:

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

Но даже когда я вручную ищу DataSource через InitialContext, я получаю ошибки при поиске. Например, вот мой образец фильтра:

@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 CXF1. Таким образом, трикотажное решение не сработает, если я не изменю реализацию JAX-RS, но это кажется излишним для чего-то пустякового.

Любая помощь будет принята с благодарностью.

Спасибо.


person Gerb    schedule 14.09.2019    source источник


Ответы (2)


Добавьте префикс java:comp/env/ к вашему имени JNDI:

... initialContext.lookup("java:comp/env/jdbc/auth/ReadDataSource");
person mentallurg    schedule 14.09.2019

В итоге я искал 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";
    }

Все работает отлично!

person Gerb    schedule 14.09.2019