]
Martin Kouba commented on CDI-713:
----------------------------------
No, this is not allowed. {{Long getIAT()}} represents a producer method (i.e. bean) and
has a normal scope ({{@RequestScope}}). And for an injection point that resolves to a
normal scoped bean a client proxy must be injected. For this reason the required bean type
must be proxyable. If the given bean type ({{Long}} in this case) cannot be proxied by the
container, the container must throw an {{UnproxyableResolutionException}}.
Note that the same rules apply to regular injection and programmatic lookup.
See also [Client
Why can't Provider<?> injection points use non-proxyable
types with @RequestScoped providers?
---------------------------------------------------------------------------------------------
Key: CDI-713
URL:
https://issues.jboss.org/browse/CDI-713
Project: CDI Specification Issues
Issue Type: Clarification
Components: Portable Extensions, Resolution
Affects Versions: 1.2.Final
Environment: WildflySwarm 2017.7.0 and Weld 2.4.3.Final.
Reporter: Scott Stark
In looking into the use of javax.inject.Provider wrapped injection point values when
dealing with @RequestScoped producers:
{code:java}
@Inject
@Claim(standard = Claims.iat)
private Provider<Long> providerIAT;
{code}
{code:java}
@Produces
@Claim(standard = Claims.iat)
@RequestScoped
Long getIAT() {
JsonWebToken jwt = getJWTPrincpal();
if (jwt == null) {
System.out.printf("getIAT, null JsonWebToken\n");
return null;
}
System.out.printf("getIAT\n");
return jwt.getIssuedAtTime();
}
{code}
I ran into the following exception:
{noformat}
Caused by: org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001437: Bean
type class java.lang.Long is not proxyable because it is final - {2}.
at org.jboss.weld.util.Proxies.getUnproxyableClassException(Proxies.java:218)
at org.jboss.weld.util.Proxies.getUnproxyableTypeException(Proxies.java:182)
at org.jboss.weld.util.Proxies.getUnproxyableTypeException(Proxies.java:144)
at
org.jboss.weld.bean.proxy.ClientProxyProvider.getClientProxy(ClientProxyProvider.java:242)
at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:736)
at org.jboss.weld.bean.builtin.InstanceImpl.getBeanInstance(InstanceImpl.java:189)
at org.jboss.weld.bean.builtin.InstanceImpl.get(InstanceImpl.java:100)
at
org.eclipse.microprofile.jwt.test.jaxrs.RolesEndpoint.getInjectedIssuer(RolesEndpoint.java:269)
{noformat}
The spec is not really clear on why this should happen as the javax.inject.Provider is a
proxy for the underlying type. It seems to me that this should be allowed, and that the
exception I'm seeing from Weld-2.4.3.Final is a bug, but I wanted to get a
clarification on why this might be disallowed.