Do you use a custome classloader? If so try to override equals/hascode to
simulate webapp one
Le 31 mars 2016 06:43, "Dimitri" <[email protected]> a écrit :

> Hi,
>
> In Tomee 7.0.0-M3, I've tried to use JavaeeInstanceManager and
> DefaultInstanceManager to instantiate dynamically loaded class. (To
> obtain the first, I used InstanceManagerFactory; for the second I've
> copied the code from your recent commit and used ContainerServlet to
> obtain parent StandardContext.)
>
> Excerpt from servlet:
>
>     StandardContext webapp = (StandardContext) wrapper.getParent();
>     DefaultInstanceManager defaultIM = new DefaultInstanceManager(
>             webapp.getNamingContextListener().getEnvContext(),
>             TomcatInjections.buildInjectionMap(webapp.getNamingResources()),
> webapp,
>             ParentClassLoaderFinder.Helper.get());
>
>     InstanceManager javaeeIM =
> InstanceManagerFactory.getInstanceManager(getServletConfig());
>
>     Object foo = null, bar = null;
>
>     try {
>
>         URLClassLoader ucl = new URLClassLoader(
>                 new URL[]{new URL("file:///home/mitya/.../classes/")}, //
> here resides external class "my.Foo"
>                 this.getClass().getClassLoader() // otherwise
> ClassNotFoundException on UserTransaction, EntityManager etc.
>         );
>
>         foo = javaeeIM.newInstance("my.Foo", ucl);
>         bar = defaultIM.newInstance("my.Foo", ucl);
>
>     } catch (IllegalAccessException | InvocationTargetException |
> NamingException | InstantiationException | ClassNotFoundException ex) {
>         LOG.log(Level.SEVERE, null, ex);
>     }
>
> Foo.java:
>
> public class Foo {
>
>     private static final Logger LOG =
> Logger.getLogger(Foo.class.getName());
>
>     @Resource(name = "foo")
>     private Integer foo;
>
>     @Resource
>     private UserTransaction tx;
>
>     @PersistenceContext
>     private EntityManager em;
>
>     @PostConstruct
>     public void post() {
>         LOG.info("Foo::post");
>         LOG.info("foo = " + foo);
>         LOG.info("em  = " + em);
>         LOG.info("tx  = " + tx);
>     }
>
> }
>
> With JavaeeInstanceManager, everything works perfect, but *only* if the
> my.Foo class is present in classpath at application startup. If loaded
> from external location, injections are not processed (nulls
> everywhere).
>
> With DefaultInstanceManager, I get the following for every injected
> field:
>
> javax.naming.NameNotFoundException: Name [my.Foo/tx] is not bound in this
> Context. Unable to find [my.Foo].
>
> Does this all work as intended? Can I do anything about it?
>
> Regards,
> Dimitri
>
>

Reply via email to