Estoy escribiendo el código de Java que usa Jackson para la serialización de JSON. Una anotación que debo usar antes de una de mis clases es @JsonTypeName(/*Insert string here*/)
, para darle a un objeto de esta clase un identificador único para la serialización. En mi código actual, establecemos el argumento String usando una constante global de otra clase. Ejemplo:Incapacidad de Java para utilizar enum como un argumento de cadena para una anotación (por ejemplo: Jackson)
public class AnnotationValues {
private static final String id1 = "1";
private static final String id2 = "2";
private static final String id3 = "3";
// And so on...
}
El uso de esta clase, nuestra anotación se vería @JsonTypeName(AnnotationValues.id1)
. Personalmente, no creo que este sea un estilo de codificación muy robusto, para usar una clase de constantes String globales. Esto se volvería molesto una vez que mi aplicación necesita manejar una mayor cantidad de mensajes JSON y, por lo tanto, requiere muchos identificadores diferentes. Naturalmente, resolvería este problema, en general, usando un enum
. Me gustaría sustituir a la clase con:
public enum AnnotationValues {
ID1("1"),
STATS_RESPONSE("2"),
SESSION_RESPONSE("3"),
/* Add more... */;
public final String value;
private AnnotationValues(String value) {
this.value = value;
}
}
Usando esta enumeración, quiero escribir @JsonTypeName(AnnotationsValues.ID1.value)
como mi anotación. Pero esto no funciona. Aparece este mensaje de error: "El valor para el atributo de anotación JsonTypeName.value debe ser una expresión constante". Una simple búsqueda en Google/SOF me llevó al this SOF post y me dijo por qué era un error; un valor de cadena para un parámetro de anotación debe ser una constante. Es bastante molesto que no pueda usar un enum
.
¿Alguien más se encuentra con este problema? ¿Cuál es la solución aceptada para este tipo de problema? ¿Realmente se supone que debo usar una larga lista de constantes de cadena para mis anotaciones? ¿Hay alguna forma de que pueda rescatar usando mi Enum? ¿Algo más?
Lo sentimos, pero ¿cómo es que _no_ es un duplicado de esa publicación que citas? http://stackoverflow.com/questions/3271659/use-enum-type-as-value-parameter-for-rolesallowed-annotation – Gray