You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2024/07/08 08:57:57 UTC

(myfaces) branch main updated: Faces Spec #1822 - Missing Generics in Faces Standard Converters

This is an automated email from the ASF dual-hosted git repository.

tandraschko pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/myfaces.git


The following commit(s) were added to refs/heads/main by this push:
     new 15cc2cf62 Faces Spec #1822 - Missing Generics in Faces Standard Converters
15cc2cf62 is described below

commit 15cc2cf62824203a70460e8a2279b1df5a06bc05
Author: tandraschko <ta...@apache.org>
AuthorDate: Mon Jul 8 10:57:44 2024 +0200

    Faces Spec #1822 - Missing Generics in Faces Standard Converters
---
 .../jakarta/faces/convert/BigDecimalConverter.java | 11 +--
 .../jakarta/faces/convert/BigIntegerConverter.java | 11 +--
 .../jakarta/faces/convert/BooleanConverter.java    | 13 +---
 .../java/jakarta/faces/convert/ByteConverter.java  | 12 +--
 .../jakarta/faces/convert/CharacterConverter.java  | 15 ++--
 .../jakarta/faces/convert/DateTimeConverter.java   |  2 +-
 .../jakarta/faces/convert/DoubleConverter.java     | 13 +---
 .../java/jakarta/faces/convert/EnumConverter.java  | 87 ++++++++--------------
 .../java/jakarta/faces/convert/FloatConverter.java | 13 +---
 .../jakarta/faces/convert/IntegerConverter.java    | 13 +---
 .../java/jakarta/faces/convert/LongConverter.java  | 14 +---
 .../jakarta/faces/convert/NumberConverter.java     | 15 ++--
 .../java/jakarta/faces/convert/ShortConverter.java | 14 +---
 .../jakarta/faces/convert/EnumConverterTest.java   | 25 +------
 .../tag/faces/html/selectOneItemGroup.xhtml        |  2 +-
 15 files changed, 77 insertions(+), 183 deletions(-)

diff --git a/api/src/main/java/jakarta/faces/convert/BigDecimalConverter.java b/api/src/main/java/jakarta/faces/convert/BigDecimalConverter.java
index def63f61c..e11d36583 100755
--- a/api/src/main/java/jakarta/faces/convert/BigDecimalConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/BigDecimalConverter.java
@@ -31,7 +31,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class BigDecimalConverter implements Converter
+public class BigDecimalConverter implements Converter<BigDecimal>
 {
     public static final String CONVERTER_ID = "jakarta.faces.BigDecimal";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -42,7 +42,7 @@ public class BigDecimalConverter implements Converter
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public BigDecimal getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -66,7 +66,7 @@ public class BigDecimalConverter implements Converter
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, BigDecimal value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -76,11 +76,6 @@ public class BigDecimalConverter implements Converter
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-        
         try
         {
             return value.toString();
diff --git a/api/src/main/java/jakarta/faces/convert/BigIntegerConverter.java b/api/src/main/java/jakarta/faces/convert/BigIntegerConverter.java
index 961085cfa..5e95c5b13 100755
--- a/api/src/main/java/jakarta/faces/convert/BigIntegerConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/BigIntegerConverter.java
@@ -31,7 +31,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class BigIntegerConverter implements Converter
+public class BigIntegerConverter implements Converter<BigInteger>
 {
     public static final String CONVERTER_ID = "jakarta.faces.BigInteger";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -42,7 +42,7 @@ public class BigIntegerConverter implements Converter
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public BigInteger getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -65,7 +65,7 @@ public class BigIntegerConverter implements Converter
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, BigInteger value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -75,11 +75,6 @@ public class BigIntegerConverter implements Converter
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-
         try
         {
             return value.toString();
diff --git a/api/src/main/java/jakarta/faces/convert/BooleanConverter.java b/api/src/main/java/jakarta/faces/convert/BooleanConverter.java
index 23a5c6937..f34c537e6 100755
--- a/api/src/main/java/jakarta/faces/convert/BooleanConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/BooleanConverter.java
@@ -29,7 +29,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class BooleanConverter implements Converter
+public class BooleanConverter implements Converter<Boolean>
 {
     public static final String CONVERTER_ID = "jakarta.faces.Boolean";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -40,7 +40,7 @@ public class BooleanConverter implements Converter
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public Boolean getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -63,7 +63,7 @@ public class BooleanConverter implements Converter
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Boolean value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -73,14 +73,9 @@ public class BooleanConverter implements Converter
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-        
         try
         {
-            return ((Boolean)value).toString();
+            return value.toString();
         }
         catch (Exception e)
         {
diff --git a/api/src/main/java/jakarta/faces/convert/ByteConverter.java b/api/src/main/java/jakarta/faces/convert/ByteConverter.java
index 613652845..4ff2b0e62 100755
--- a/api/src/main/java/jakarta/faces/convert/ByteConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/ByteConverter.java
@@ -20,7 +20,6 @@ package jakarta.faces.convert;
 
 import jakarta.faces.component.UIComponent;
 import jakarta.faces.context.FacesContext;
-
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFConverter;
 import org.apache.myfaces.core.api.shared.MessageUtils;
 import org.apache.myfaces.core.api.shared.lang.Assert;
@@ -29,7 +28,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class ByteConverter implements Converter
+public class ByteConverter implements Converter<Byte>
 {
     public static final String CONVERTER_ID = "jakarta.faces.Byte";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -40,7 +39,7 @@ public class ByteConverter implements Converter
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public Byte getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -63,7 +62,7 @@ public class ByteConverter implements Converter
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Byte value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -73,11 +72,6 @@ public class ByteConverter implements Converter
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-        
         try
         {
             return Byte.toString(((Number)value).byteValue());
diff --git a/api/src/main/java/jakarta/faces/convert/CharacterConverter.java b/api/src/main/java/jakarta/faces/convert/CharacterConverter.java
index d52d32e20..8724527f9 100755
--- a/api/src/main/java/jakarta/faces/convert/CharacterConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/CharacterConverter.java
@@ -29,7 +29,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class CharacterConverter implements Converter
+public class CharacterConverter implements Converter<Character>
 {
     public static final String CONVERTER_ID = "jakarta.faces.Character";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -40,7 +40,7 @@ public class CharacterConverter implements Converter
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public Character getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -52,7 +52,7 @@ public class CharacterConverter implements Converter
         
         try
         {
-            return Character.valueOf(value.charAt(0));
+            return value.charAt(0);
         }
         catch(Exception e)
         {
@@ -63,7 +63,7 @@ public class CharacterConverter implements Converter
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Character value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -73,14 +73,9 @@ public class CharacterConverter implements Converter
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-        
         try
         {
-            return ((Character)value).toString();
+            return value.toString();
         }
         catch (Exception e)
         {
diff --git a/api/src/main/java/jakarta/faces/convert/DateTimeConverter.java b/api/src/main/java/jakarta/faces/convert/DateTimeConverter.java
index 8dc2804a1..01201cf5a 100755
--- a/api/src/main/java/jakarta/faces/convert/DateTimeConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/DateTimeConverter.java
@@ -58,7 +58,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
     returnType = "jakarta.faces.convert.DateTimeConverter",
     longDesc = "A ValueExpression that evaluates to a DateTimeConverter.")
 public class DateTimeConverter
-        implements Converter, PartialStateHolder
+        implements Converter<Object>, PartialStateHolder
 {
 
     // API field
diff --git a/api/src/main/java/jakarta/faces/convert/DoubleConverter.java b/api/src/main/java/jakarta/faces/convert/DoubleConverter.java
index a5b879308..52aa118ae 100755
--- a/api/src/main/java/jakarta/faces/convert/DoubleConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/DoubleConverter.java
@@ -32,7 +32,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class DoubleConverter implements Converter
+public class DoubleConverter implements Converter<Double>
 {
     public static final String CONVERTER_ID = "jakarta.faces.Double";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -43,7 +43,7 @@ public class DoubleConverter implements Converter
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public Double getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -116,7 +116,7 @@ public class DoubleConverter implements Converter
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Double value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -126,14 +126,9 @@ public class DoubleConverter implements Converter
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-
         try
         {
-            return Double.toString(((Number)value).doubleValue());
+            return Double.toString(value);
         }
         catch (Exception e)
         {
diff --git a/api/src/main/java/jakarta/faces/convert/EnumConverter.java b/api/src/main/java/jakarta/faces/convert/EnumConverter.java
index 179d91aec..8b9e3cc77 100644
--- a/api/src/main/java/jakarta/faces/convert/EnumConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/EnumConverter.java
@@ -24,7 +24,6 @@ import jakarta.faces.component.UIComponent;
 import jakarta.faces.context.FacesContext;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFConverter;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
 import org.apache.myfaces.core.api.shared.MessageUtils;
 import org.apache.myfaces.core.api.shared.lang.Assert;
 
@@ -32,23 +31,12 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/j2ee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class EnumConverter implements Converter, PartialStateHolder
+public class EnumConverter implements Converter<Enum>, PartialStateHolder
 {
-
     public static final String CONVERTER_ID = "jakarta.faces.Enum";
     public static final String ENUM_ID = "jakarta.faces.converter.EnumConverter.ENUM";
     public static final String ENUM_NO_CLASS_ID = "jakarta.faces.converter.EnumConverter.ENUM_NO_CLASS";
 
-    /**
-     * If value is a String instance and this param is true, pass it directly without try any change.
-     * 
-     * See MYFACES-2739 for details.
-     */
-    @JSFWebConfigParam(name="org.apache.myfaces.ENUM_CONVERTER_ALLOW_STRING_PASSTROUGH", since="2.0.1",
-                       expectedValues="true,false",defaultValue="false", group="validation")
-    private static final String ALLOW_STRING_PASSTROUGH = "org.apache.myfaces.ENUM_CONVERTER_ALLOW_STRING_PASSTROUGH";
-    
-    // TODO: Find a valid generic usage -= Simon Lessard =-
     private Class targetClass;
 
     private boolean isTransient = false;
@@ -67,49 +55,17 @@ public class EnumConverter implements Converter, PartialStateHolder
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public Enum<?> getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
 
-        checkTargetClass(facesContext, uiComponent, value);
-
-        if (value == null)
-        {
-            return "";
-        }
-        
-        if (value instanceof String string
-                && _isPassThroughStringValues(facesContext))
-        {
-            // pass through the String value
-            return string;
-        }
-
-        // check if the value is an instance of the enum class
-        if (targetClass.isInstance(value))
-        {
-            return ((Enum<?>) value).name();
-        }
-        
-        Object[] params =
-            new Object[] { value, firstConstantOfEnum(), MessageUtils.getLabel(facesContext, uiComponent) };
-
-        throw new ConverterException(MessageUtils.getErrorMessage(facesContext, ENUM_ID, params));
-    }
-
-    @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
-    {
-        Assert.notNull(facesContext, "facesContext");
-        Assert.notNull(uiComponent, "uiComponent");
-        
         if (value == null)
         {
             return null;
         }
         value = value.trim();
-        if (value.length() == 0)
+        if (value.isEmpty())
         {
             return null;
         }
@@ -130,6 +86,32 @@ public class EnumConverter implements Converter, PartialStateHolder
         }
     }
 
+    @Override
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Enum value)
+    {
+        Assert.notNull(facesContext, "facesContext");
+        Assert.notNull(uiComponent, "uiComponent");
+
+        checkTargetClass(facesContext, uiComponent, value);
+
+        if (value == null)
+        {
+            return "";
+        }
+
+        // check if the value is an instance of the enum class
+        if (targetClass.isInstance(value))
+        {
+            return value.name();
+        }
+        
+        Object[] params =
+            new Object[] { value, firstConstantOfEnum(), MessageUtils.getLabel(facesContext, uiComponent) };
+
+        throw new ConverterException(MessageUtils.getErrorMessage(facesContext, ENUM_ID, params));
+    }
+
+
     private void checkTargetClass(FacesContext facesContext, UIComponent uiComponent, Object value)
     {
         if (targetClass == null)
@@ -202,16 +184,5 @@ public class EnumConverter implements Converter, PartialStateHolder
     {
         _initialStateMarked = true;
     }
-    
-    private boolean _isPassThroughStringValues(FacesContext facesContext)
-    {
-        String param = facesContext.getExternalContext().getInitParameter(ALLOW_STRING_PASSTROUGH);
-        if (param != null)
-        {
-            return param.trim().equalsIgnoreCase("true");
-        }
-        // default: false
-        return false;
-    }
 
 }
diff --git a/api/src/main/java/jakarta/faces/convert/FloatConverter.java b/api/src/main/java/jakarta/faces/convert/FloatConverter.java
index 57fc15807..cd1e5095f 100755
--- a/api/src/main/java/jakarta/faces/convert/FloatConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/FloatConverter.java
@@ -29,7 +29,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class FloatConverter implements Converter
+public class FloatConverter implements Converter<Float>
 {
     public static final String CONVERTER_ID = "jakarta.faces.Float";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -40,7 +40,7 @@ public class FloatConverter implements Converter
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public Float getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -63,7 +63,7 @@ public class FloatConverter implements Converter
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Float value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -73,14 +73,9 @@ public class FloatConverter implements Converter
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-
         try
         {
-            return Float.toString(((Number) value).floatValue());
+            return Float.toString(value);
         }
         catch (Exception e)
         {
diff --git a/api/src/main/java/jakarta/faces/convert/IntegerConverter.java b/api/src/main/java/jakarta/faces/convert/IntegerConverter.java
index 74ff66404..ad5fa4c33 100755
--- a/api/src/main/java/jakarta/faces/convert/IntegerConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/IntegerConverter.java
@@ -29,7 +29,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class IntegerConverter implements Converter
+public class IntegerConverter implements Converter<Integer>
 {
     public static final String CONVERTER_ID = "jakarta.faces.Integer";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -40,7 +40,7 @@ public class IntegerConverter implements Converter
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public Integer getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -63,7 +63,7 @@ public class IntegerConverter implements Converter
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Integer value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -73,14 +73,9 @@ public class IntegerConverter implements Converter
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-
         try
         {
-            return Integer.toString(((Number) value).intValue());
+            return Integer.toString(value);
         }
         catch (Exception e)
         {
diff --git a/api/src/main/java/jakarta/faces/convert/LongConverter.java b/api/src/main/java/jakarta/faces/convert/LongConverter.java
index 2aa13e278..919699243 100755
--- a/api/src/main/java/jakarta/faces/convert/LongConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/LongConverter.java
@@ -20,7 +20,6 @@ package jakarta.faces.convert;
 
 import jakarta.faces.component.UIComponent;
 import jakarta.faces.context.FacesContext;
-
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFConverter;
 import org.apache.myfaces.core.api.shared.MessageUtils;
 import org.apache.myfaces.core.api.shared.lang.Assert;
@@ -29,7 +28,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class LongConverter implements Converter
+public class LongConverter implements Converter<Long>
 {
     public static final String CONVERTER_ID = "jakarta.faces.Long";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -40,7 +39,7 @@ public class LongConverter implements Converter
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public Long getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -63,7 +62,7 @@ public class LongConverter implements Converter
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Long value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -73,14 +72,9 @@ public class LongConverter implements Converter
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-
         try
         {
-            return Long.toString(((Number) value).longValue());
+            return Long.toString(value);
         }
         catch (Exception e)
         {
diff --git a/api/src/main/java/jakarta/faces/convert/NumberConverter.java b/api/src/main/java/jakarta/faces/convert/NumberConverter.java
index 058e53c58..5661d7b9c 100755
--- a/api/src/main/java/jakarta/faces/convert/NumberConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/NumberConverter.java
@@ -52,7 +52,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
     name="binding", 
     returnType = "jakarta.faces.convert.NumberConverter",
     longDesc = "A ValueExpression that evaluates to a NumberConverter.")
-public class NumberConverter implements Converter, PartialStateHolder
+public class NumberConverter implements Converter<Number>, PartialStateHolder
 {
     public static final String CONVERTER_ID = "jakarta.faces.Number";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -84,7 +84,7 @@ public class NumberConverter implements Converter, PartialStateHolder
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public Number getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -178,10 +178,10 @@ public class NumberConverter implements Converter, PartialStateHolder
         return null;
     }
 
-    private Object parse(String value, NumberFormat format, Class<?> destType)
+    private Number parse(String value, NumberFormat format, Class<?> destType)
         throws ParseException
     {
-        Object parsed = null;
+        Number parsed = null;
         
         ParsePosition parsePosition = new ParsePosition(0);
         if (destType == BigInteger.class)
@@ -213,7 +213,7 @@ public class NumberConverter implements Converter, PartialStateHolder
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Number value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -223,11 +223,6 @@ public class NumberConverter implements Converter, PartialStateHolder
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-
         NumberFormat format = getNumberFormat(facesContext);
         format.setGroupingUsed(_groupingUsed);
         if (_maxFractionDigitsSet)
diff --git a/api/src/main/java/jakarta/faces/convert/ShortConverter.java b/api/src/main/java/jakarta/faces/convert/ShortConverter.java
index ad87f9f06..55b38d686 100755
--- a/api/src/main/java/jakarta/faces/convert/ShortConverter.java
+++ b/api/src/main/java/jakarta/faces/convert/ShortConverter.java
@@ -20,7 +20,6 @@ package jakarta.faces.convert;
 
 import jakarta.faces.component.UIComponent;
 import jakarta.faces.context.FacesContext;
-
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFConverter;
 import org.apache.myfaces.core.api.shared.MessageUtils;
 import org.apache.myfaces.core.api.shared.lang.Assert;
@@ -29,7 +28,7 @@ import org.apache.myfaces.core.api.shared.lang.Assert;
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">Faces Specification</a>
  */
 @JSFConverter
-public class ShortConverter implements Converter
+public class ShortConverter implements Converter<Short>
 {
     public static final String CONVERTER_ID = "jakarta.faces.Short";
     public static final String STRING_ID = "jakarta.faces.converter.STRING";
@@ -40,7 +39,7 @@ public class ShortConverter implements Converter
     }
 
     @Override
-    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
+    public Short getAsObject(FacesContext facesContext, UIComponent uiComponent, String value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -63,7 +62,7 @@ public class ShortConverter implements Converter
     }
 
     @Override
-    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value)
+    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Short value)
     {
         Assert.notNull(facesContext, "facesContext");
         Assert.notNull(uiComponent, "uiComponent");
@@ -73,14 +72,9 @@ public class ShortConverter implements Converter
             return "";
         }
 
-        if (value instanceof String string)
-        {
-            return string;
-        }
-
         try
         {
-            return Short.toString(((Number) value).shortValue());
+            return Short.toString(value);
         }
         catch (Exception e)
         {
diff --git a/impl/src/test/java/jakarta/faces/convert/EnumConverterTest.java b/impl/src/test/java/jakarta/faces/convert/EnumConverterTest.java
index f66f21da1..7a38bf904 100644
--- a/impl/src/test/java/jakarta/faces/convert/EnumConverterTest.java
+++ b/impl/src/test/java/jakarta/faces/convert/EnumConverterTest.java
@@ -130,7 +130,7 @@ public class EnumConverterTest extends AbstractJsfTestCase
 
     /**
      * Test method for
-     * {@link jakarta.faces.convert.EnumConverter#getAsString(FacesContext, jakarta.faces.component.UIComponent, Object)}.
+     * {@link jakarta.faces.convert.EnumConverter#getAsString(FacesContext, jakarta.faces.component.UIComponent, Enum)}.
      */
     @Test
     public void testGetAsString()
@@ -142,7 +142,7 @@ public class EnumConverterTest extends AbstractJsfTestCase
 
     /**
      * Test method for
-     * {@link jakarta.faces.convert.EnumConverter#getAsString(FacesContext, jakarta.faces.component.UIComponent, Object)}.
+     * {@link jakarta.faces.convert.EnumConverter#getAsString(FacesContext, jakarta.faces.component.UIComponent, Enum)}.
      */
     @Test
     public void testGetAsStringNull()
@@ -154,26 +154,7 @@ public class EnumConverterTest extends AbstractJsfTestCase
 
     /**
      * Test method for
-     * {@link jakarta.faces.convert.EnumConverter#getAsString(FacesContext, jakarta.faces.component.UIComponent, Object)}.
-     */
-    @Test
-    public void testGetAsStringNoEnum()
-    {
-        UIInput input = new UIInput();
-        try
-        {
-            String convertedStr = converter.getAsString(FacesContext.getCurrentInstance(), input, "HALLO");
-            Assertions.fail("Converter exception should be thrown");
-        }
-        catch (ConverterException e)
-        {
-            // should be thrown
-        }
-    }
-
-    /**
-     * Test method for
-     * {@link jakarta.faces.convert.EnumConverter#getAsString(FacesContext, jakarta.faces.component.UIComponent, Object)}.
+     * {@link jakarta.faces.convert.EnumConverter#getAsString(FacesContext, jakarta.faces.component.UIComponent, Enum)}.
      */
     @Test
     public void testGetAsStringNoClassSet()
diff --git a/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/faces/html/selectOneItemGroup.xhtml b/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/faces/html/selectOneItemGroup.xhtml
index f1611a87d..dd6fc7469 100644
--- a/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/faces/html/selectOneItemGroup.xhtml
+++ b/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/faces/html/selectOneItemGroup.xhtml
@@ -28,7 +28,7 @@
             <f:selectItems value="#{selectOneItemGroupTestBean.animalList}" var="animal" itemValue="#{animal.id}" itemLabel="#{animal.name}" />
         </f:selectItemGroup>
         <f:selectItemGroup itemLabel="Food">
-            <f:selectItem value="${4}" itemValue="Kibble" />
+            <f:selectItem itemValue="${4}" itemLabel="Kibble" />
         </f:selectItemGroup>
     </h:selectOneMenu>
 </form>