Quick followup. I tried similar JSP in Tomcat 8.0.27, and wow! @Resource
injection into JSP worked like a charm!
context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/foo" privileged="true">
<Environment name="foo" value="42" type="java.lang.Integer"
override="false"/>
</Context>
JSP:
<%!
@Resource(name = "foo")
private Integer foo;
%>
<html>
<body>
foo = <%= foo %>
</body>
</html>
This successfully rendered foo = 42.
Things were much more complicated in TomEE. I couldn't find a way to make
@Resource work in JSP at all.
Whether a resource was defined in WEB-INF/resources.xml, or was it something
like ManagedExecutorService - @Resource didn't work either.
In the case of ManagedExecutorService, I was able to lookup it manually in JNDI
(as java:comp/DefaultManagedExecutorService).
In the case of resources.xml-defined entry, I didn't manage to resolve it even
through JNDI manually.
In Tomcat, on the contrary, user-defined resources are resolvable in JSP both
via @Resource injection and manual JNDI lookup.
I'm using TomeEE 7.0.0-M3. Didn't try 1.7.4 though.
Dimitri
> >
> > (that's
> > why hot reloading is a good bad idea and can break after a restart
> > even if "F5" tests were green ;)).
> Oh yeah, I've got obscure errors after hot reloading hundreds of
> times.
> Most of them were JNDI-related, by the way ;)
>
> >
> > Hmm, maybe not. JSP support injections and are generated at runtime
> > so
> > it needs some glue code but reusing the same principle would work
> > and
> > this API even if internal is more stable (see InstanceManager of
> > tomcat).
> That's it - JSPs came to my mind even before the idea of generating
> annotated classes. Needless to say I did some testing...
>
> =============================== 8<
> ===================================
> <%@page import="javax.enterprise.inject.spi.BeanManager"%>
> <%@page import="javax.inject.Inject"%>
> <%@page import="java.util.logging.Logger"%>
> <%@page import="javax.transaction.UserTransaction"%>
> <%@page import="javax.annotation.Resource"%>
> <%@page import="javax.annotation.PostConstruct"%>
>
> <%@page contentType="text/html" pageEncoding="UTF-8"%>
>
> <%!
> @Resource
> private UserTransaction tx;
>
> @Inject
> private BeanManager bm;
>
> private final static Logger LOG = Logger.getLogger("foo.jsp");
>
> @PostConstruct
> public void post() {
> LOG.info("foo.jsp::post()");
> LOG.info("tx = " + tx);
> LOG.info("bm = " + bm);
> }
> %>
>
> <%
> request.setAttribute("tx", tx);
> request.setAttribute("bm", bm);
> %>
>
> <!DOCTYPE html>
> <html>
> <head>
> <meta http-equiv="Content-Type" content="text/html;
> charset=UTF-8">
> <title>JSP Page</title>
> </head>
> <body>
> tx = ${requestScope.tx}<br>
> bm = ${requestScope.bm}<br>
> </body>
> </html>
> =============================== 8<
> ===================================
>
> The results were, errr, a bit disappointing.
>
> TomEE 7.0.0-M3
> ==============
> tx = null
> bm = org.apache.webbeans.container.InjectableBeanManager@b4ecb2
> @PostConstruct: invoked
>
> WildFly 10.0.0
> ==============
> tx = null
> bm = null
> @PostConstruct: not invoked
>
> GlassFish/Payara 4.1.1
> ======================
> bm = (had to remove BeanManager since JSP didn't compile)
> tx = null
> @PostConstruct: not invoked
>
> Is it another blind-spot in the spec? or is it a bug? or am I doing
> it
> totally wrong?
>
> Dimitri