[jboss-jira] [JBoss JIRA] (WFLY-5369) Wildfly doesn't handle @Resource name attribute for DataSource type

Ivn Lahav (JIRA) issues at jboss.org
Sun Sep 20 21:53:00 EDT 2015


    [ https://issues.jboss.org/browse/WFLY-5369?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13110612#comment-13110612 ] 

Ivn Lahav edited comment on WFLY-5369 at 9/20/15 9:52 PM:
----------------------------------------------------------

Hi Jason,

> that the unbound entry would have been defined/configured either on the server or via a DD
But notice that we are doing exactly that. The class-level @Resource annotation is equivalent of DD:
{code}
@Resource(name="db1", lookup="java:jboss/datasources/ExampleDS", type=DataSource.class)
{code}
Now, I tried replacing this annotation with the equivalent entry in web.xml:
{code}
<resource-env-ref>
    <resource-env-ref-name>db1</resource-env-ref-name>
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>	  
    <lookup-name>java:jboss/datasources/ExampleDS</lookup-name>
</resource-env-ref>
{code}
(while keeping the field level annotation) and it started working!

So xml and annotation should produce the same result, yet the annotation doesn't work (when combined with field level annotation).



was (Author: user992281):
Hi Jason,

> that the unbound entry would have been defined/configured either on the server or via a DD
But notice that we are doing exactly that. The class-level @Resource annotation is equivalent of DD:
{code}
@Resource(name="db1", lookup="java:jboss/datasources/ExampleDS", type=DataSource.class)
{code}
Now, I tried replacing this annotation with the equivalent entry in web.xml:
{code}
<resource-env-ref>
    <resource-env-ref-name>db1</resource-env-ref-name>
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>	  
    <lookup-name>java:jboss/datasources/ExampleDS</lookup-name>
</resource-env-ref>
{code}
(while keeping the field level annotation) and it started working!

So xml and annotation should produce the same result, yet the annotation doesn't work.


> Wildfly doesn't handle @Resource name attribute for DataSource type
> -------------------------------------------------------------------
>
>                 Key: WFLY-5369
>                 URL: https://issues.jboss.org/browse/WFLY-5369
>             Project: WildFly
>          Issue Type: Bug
>    Affects Versions: 9.0.1.Final
>            Reporter: Ivn Lahav
>            Assignee: Jason Greene
>             Fix For: No Release
>
>
> When using {{@Resource}} with {{name}} attribute to inject an object from environment naming context (ENC) into a servlet or EJB, Wildfly is producing an error.
> Here is an example from injecting into Servlet (the same is with injecting into EJBs).
> First the part that does work:
> {code}
> @WebServlet(loadOnStartup=1)
> @Resource(name="db1", lookup="java:jboss/datasources/ExampleDS", type=DataSource.class)
> public class Servlet1 extends HttpServlet {
>         @PostConstruct
> 	public void init0() throws Exception {
> 		System.out.println("___________db1: " + InitialContext.doLookup("java:comp/env/db1"));
> 	}
> }
> {code}
> So we can see that the ENC entry {{db1}} is properly defined and can be looked up.
> Now we  add a field to the above class and use {{@Resource}} injection:
> {code}
> @Resource(name='db1')
> DataSource ds;
> {code}
> we get the this error:
> {code}
> Caused by: java.lang.IllegalArgumentException: WFLYEE0047: Incompatible conflicting binding at java:module/env/db1 source: lookup (java:jboss/datasources/ExampleDS)
> 	at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.addJndiBinding(ModuleJndiBindingProcessor.java:221)
> 	at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor$1.handle(ModuleJndiBindingProcessor.java:183)
> 	at org.jboss.as.ee.component.ClassDescriptionTraversal.run(ClassDescriptionTraversal.java:54)
> 	at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.processClassConfigurations(ModuleJndiBindingProcessor.java:187)
> 	at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.deploy(ModuleJndiBindingProcessor.java:144)
> 	at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:156)
> 	... 5 more
> {code}
> Interestingly, if I change the data type of a field from {{DataSource}} to {{Object}}, things start working.
> This is a very basic functionality of Java EE and we are using it extensively to produce vendor independent deployment units that directly reference only logical ENC entries and not physical vendor specific JNDI names. Then during deployment the administrator would customize the mapping to match the application server and a specific environment.



--
This message was sent by Atlassian JIRA
(v6.4.11#64026)


More information about the jboss-jira mailing list