MYFACES-4311 ustom Converters Do Not Support Generics
diff --git a/impl/src/main/java/org/apache/myfaces/cdi/util/CDIUtils.java b/impl/src/main/java/org/apache/myfaces/cdi/util/CDIUtils.java
index e22387b..934d068 100644
--- a/impl/src/main/java/org/apache/myfaces/cdi/util/CDIUtils.java
+++ b/impl/src/main/java/org/apache/myfaces/cdi/util/CDIUtils.java
@@ -99,6 +99,21 @@
}
}
+ public static <T> T get(BeanManager beanManager, Type type, boolean create, Annotation... qualifiers)
+ {
+ try
+ {
+ Set<Bean<?>> beans = beanManager.getBeans(type, qualifiers);
+ Bean<T> bean = (Bean<T>) beanManager.resolve(beans);
+
+ return (bean != null) ? get(beanManager, bean, type, create) : null;
+ }
+ catch (ContextNotActiveException e)
+ {
+ return null;
+ }
+ }
+
public static <T> T get(BeanManager beanManager, Bean<T> bean, Type type, boolean create)
{
if (create)
diff --git a/impl/src/main/java/org/apache/myfaces/cdi/wrapper/FacesConverterCDIWrapper.java b/impl/src/main/java/org/apache/myfaces/cdi/wrapper/FacesConverterCDIWrapper.java
index 9a2fa23..2183080 100644
--- a/impl/src/main/java/org/apache/myfaces/cdi/wrapper/FacesConverterCDIWrapper.java
+++ b/impl/src/main/java/org/apache/myfaces/cdi/wrapper/FacesConverterCDIWrapper.java
@@ -19,6 +19,9 @@
package org.apache.myfaces.cdi.wrapper;
+import java.lang.reflect.Type;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.util.TypeLiteral;
import javax.faces.FacesWrapper;
import javax.faces.component.PartialStateHolder;
import javax.faces.component.UIComponent;
@@ -32,6 +35,10 @@
*/
public class FacesConverterCDIWrapper implements PartialStateHolder, Converter, FacesWrapper<Converter>
{
+ private static final Type CONVERTER_TYPE = new TypeLiteral<Converter<?>>() {
+ private static final long serialVersionUID = 1L;
+ }.getType();
+
private transient Converter delegate;
private Class<?> forClass;
@@ -65,17 +72,28 @@
{
if (delegate == null)
{
+ BeanManager bm = CDIUtils.getBeanManager(FacesContext.getCurrentInstance().getExternalContext());
+
if (converterId != null)
{
- delegate = (Converter) CDIUtils.get(CDIUtils.getBeanManager(
- FacesContext.getCurrentInstance().getExternalContext()),
- Converter.class, true, new FacesConverterAnnotationLiteral(Object.class, converterId));
+ FacesConverterAnnotationLiteral literal =
+ new FacesConverterAnnotationLiteral(Object.class, converterId);
+ delegate = (Converter) CDIUtils.get(bm, CONVERTER_TYPE, true, literal);
+
+ if (delegate == null)
+ {
+ delegate = (Converter) CDIUtils.get(bm, Converter.class, true, literal);
+ }
}
else if (forClass != null)
{
- delegate = (Converter) CDIUtils.get(CDIUtils.getBeanManager(
- FacesContext.getCurrentInstance().getExternalContext()),
- Converter.class, true, new FacesConverterAnnotationLiteral(forClass, ""));
+ FacesConverterAnnotationLiteral literal = new FacesConverterAnnotationLiteral(forClass, "");
+ delegate = (Converter) CDIUtils.get(bm, CONVERTER_TYPE, true, literal);
+
+ if (delegate == null)
+ {
+ delegate = (Converter) CDIUtils.get(bm, Converter.class, true, literal);
+ }
}
}
return delegate;
diff --git a/impl/src/main/java/org/apache/myfaces/cdi/wrapper/FacesValidatorCDIWrapper.java b/impl/src/main/java/org/apache/myfaces/cdi/wrapper/FacesValidatorCDIWrapper.java
index 9a959b3..5f9b653 100644
--- a/impl/src/main/java/org/apache/myfaces/cdi/wrapper/FacesValidatorCDIWrapper.java
+++ b/impl/src/main/java/org/apache/myfaces/cdi/wrapper/FacesValidatorCDIWrapper.java
@@ -19,6 +19,9 @@
package org.apache.myfaces.cdi.wrapper;
+import java.lang.reflect.Type;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.util.TypeLiteral;
import javax.faces.FacesWrapper;
import javax.faces.component.PartialStateHolder;
import javax.faces.component.UIComponent;
@@ -29,6 +32,11 @@
public class FacesValidatorCDIWrapper implements PartialStateHolder, Validator, FacesWrapper<Validator>
{
+ private static final Type VALIDATOR_TYPE = new TypeLiteral<Validator<?>>()
+ {
+ private static final long serialVersionUID = 1L;
+ }.getType();
+
private transient Validator delegate;
private String validatorId;
@@ -55,9 +63,14 @@
{
if (delegate == null)
{
- delegate = (Validator) CDIUtils.get(CDIUtils.getBeanManager(
- FacesContext.getCurrentInstance().getExternalContext()),
- Validator.class, true, new FacesValidatorAnnotationLiteral(validatorId));
+ BeanManager bm = CDIUtils.getBeanManager(FacesContext.getCurrentInstance().getExternalContext());
+ FacesValidatorAnnotationLiteral literal = new FacesValidatorAnnotationLiteral(validatorId);
+ delegate = (Validator) CDIUtils.get(bm, VALIDATOR_TYPE, true, literal);
+
+ if (delegate == null)
+ {
+ delegate = (Validator) CDIUtils.get(bm, Validator.class, true, literal);
+ }
}
return delegate;
}