Furhter fixing of [JACKSON-757]
diff --git a/src/mapper/java/org/codehaus/jackson/map/introspect/AnnotatedClass.java b/src/mapper/java/org/codehaus/jackson/map/introspect/AnnotatedClass.java index 42afb88..837d9ab 100644 --- a/src/mapper/java/org/codehaus/jackson/map/introspect/AnnotatedClass.java +++ b/src/mapper/java/org/codehaus/jackson/map/introspect/AnnotatedClass.java
@@ -783,21 +783,20 @@ // first, only applicable for member classes and then either: Class<?> dc = ctor.getDeclaringClass(); - if (dc.isMemberClass()) { - // (a) just one annotation (for non-static inner classes) + // (a) is enum, which have two extra hidden params (name, index) + if (dc.isEnum() && (paramCount == paramAnns.length + 2)) { + Annotation[][] old = paramAnns; + paramAnns = new Annotation[old.length+2][]; + System.arraycopy(old, 0, paramAnns, 2, old.length); + resolvedAnnotations = _collectRelevantAnnotations(paramAnns); + } else if (dc.isMemberClass()) { + // (b) non-static inner classes, get implicit 'this' for parameter, not annotation if (paramCount == (paramAnns.length + 1)) { // hack attack: prepend a null entry to make things match Annotation[][] old = paramAnns; paramAnns = new Annotation[old.length+1][]; System.arraycopy(old, 0, paramAnns, 1, old.length); resolvedAnnotations = _collectRelevantAnnotations(paramAnns); - - // (b) or is enum, which have two extra hidden params (but not for annotations!) - } else if (dc.isEnum() && (paramCount == paramAnns.length + 2)) { - Annotation[][] old = paramAnns; - paramAnns = new Annotation[old.length+2][]; - System.arraycopy(old, 0, paramAnns, 2, old.length); - resolvedAnnotations = _collectRelevantAnnotations(paramAnns); } } if (resolvedAnnotations == null) {
diff --git a/src/test/org/codehaus/jackson/map/ser/TestEnumSerialization.java b/src/test/org/codehaus/jackson/map/ser/TestEnumSerialization.java index 4057676..c20897b 100644 --- a/src/test/org/codehaus/jackson/map/ser/TestEnumSerialization.java +++ b/src/test/org/codehaus/jackson/map/ser/TestEnumSerialization.java
@@ -256,7 +256,17 @@ public void testAnnotationsOnEnumCtor() throws Exception { ObjectMapper mapper = new ObjectMapper(); - mapper.writeValueAsString(OK.V1); - mapper.writeValueAsString(NOT_OK.V1); + assertEquals(quote("V1"), mapper.writeValueAsString(OK.V1)); + assertEquals(quote("V1"), mapper.writeValueAsString(NOT_OK.V1)); + assertEquals(quote("V2"), mapper.writeValueAsString(NOT_OK2.V2)); } } + + +// [JACKSON-757], non-inner enum +enum NOT_OK2 { + V2("v2"); + protected String key; + // any runtime-persistent annotation is fine + NOT_OK2(@JsonProperty String key) { this.key = key; } +}