[cdi-dev] [JBoss JIRA] (CDI-713) Why can't Provider<?> injection points use non-proxyable types with @RequestScoped providers?
Martin Kouba (JIRA)
issues at jboss.org
Fri Aug 18 06:20:00 EDT 2017
[ https://issues.jboss.org/browse/CDI-713?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13451240#comment-13451240 ]
Martin Kouba commented on CDI-713:
----------------------------------
A simple solution for the use case above might be something like:
{code:java}
@RequestScoped
class IssuedAtTimeProducer {
Long issuedAtTime;
@PostConstruct
void init() {
JsonWebToken jwt = getJWTPrincpal();
if (jwt == null) {
issuedAtTime = null;
}
issuedAtTime = jwt.getIssuedAtTime();
}
@Produces
@Claim(standard = Claims.iat)
Long getIAT() {
return issuedAtTime;
}
}
{code}
By the way, a producer method must have scope {{@Dependent}} if it sometimes returns {{null}} (otherwise {{IllegalProductException}} is thrown).
> 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.
--
This message was sent by Atlassian JIRA
(v7.2.3#72005)
More information about the cdi-dev
mailing list