espaƱol bean java string dependency-injection cdi named

java - bean - Inyectar un String con nombre usando CDI



cdi java 8 (1)

Parece que necesita un constructor predeterminado (no-arg) para su MyManagedBean para hacerlo proxyable. No estoy realmente seguro de por qué es necesario, ya que MyManagedBean es un bean @Dependent y por lo tanto no es proxy AFAIK; No sé por qué un bean proxyable necesita un constructor predeterminado, para ser honesto Esto parece ser un detalle de implementación o un pequeño punto de la especificación CDI que se ignoró. De todos modos, apuesto a que puede hacer una buena pregunta nueva :)

EDITAR : descubrí por qué un bean proxyable necesita una construcción predeterminada. En realidad, no es un misterio: dado que el proxy de un bean es una subclase del mismo bean, el proxy necesita llamar a un constructor super() en su propia construcción. Si no tiene un constructor predeterminado no privado, no sabe a qué constructor llamar. Incluso se puede imaginar un escenario donde se llama al constructor inyectado para crear el proxy, pero no sé qué tipo de complejidad puede agregar a una implementación de CDI; puede que no sea tan fácil de hacer ...

Quiero tener un parámetro de configuración inyectado de esta manera:

public class MyManagedBean { @Inject public MyManagedBean(@Named("user") String user){ .... } }

Así que traté de implementar un método de productor de esta manera:

@ApplicationScoped public class MyConfiguration { private Properties loadProperties() { Properties properties = new Properties(); try { properties.load(getClass().getResourceAsStream( "user.properties")); } catch (IOException e) { throw new RuntimeException(); } return properties; } @Produces @Named("user") String getUser() { return loadProperties().getProperty("user"); } }

Tengo otro grano definido de esta manera:

public class OtherManagedBean { @Inject public OtherManagedBean(MyManagedBean myManagedBean){ .... } }

Sin embargo, tengo esta excepción cuando intento implementarla:

INFO: WEB0671: Loading application [example-ear#example-war.war] at [example] SEVERE: Exception while loading the app SEVERE: Exception while loading the app : WELD-001410 The injection point [parameter 1] of [constructor] @Inject public com.example.OtherManagedBean(MyManagedBean) has non-proxyable dependencies org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001410 The injection point [parameter 1] of [constructor] @Inject public com.example.OtherManagedBean(MyManagedBean) has non-proxyable dependencies at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:317) at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:139) at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:162) at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:385) at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:371) at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:390) at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:190) at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128) at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:298) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370) at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1067) at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96) at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1247) at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235) at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:465) at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:222) at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168) at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:234) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:662)

¿Alguna idea?

Gracias.