diff --git a/jackson/src/main/java/org/projectnessie/cel/types/jackson/JacksonEnumDescription.java b/jackson/src/main/java/org/projectnessie/cel/types/jackson/JacksonEnumDescription.java index 09eae2b4..350f52ba 100644 --- a/jackson/src/main/java/org/projectnessie/cel/types/jackson/JacksonEnumDescription.java +++ b/jackson/src/main/java/org/projectnessie/cel/types/jackson/JacksonEnumDescription.java @@ -16,8 +16,9 @@ package org.projectnessie.cel.types.jackson; import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ser.std.EnumSerializer; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.Stream; import org.projectnessie.cel.common.types.pb.Checked; @@ -27,9 +28,12 @@ final class JacksonEnumDescription { private final com.google.api.expr.v1alpha1.Type pbType; private final List> enumValues; - JacksonEnumDescription(JavaType javaType, EnumSerializer ser) { + JacksonEnumDescription(JavaType javaType) { this.name = javaType.getRawClass().getName().replace('$', '.'); - this.enumValues = ser.getEnumValues().enums(); + this.enumValues = + Arrays.stream(javaType.getRawClass().getEnumConstants()) + .map(enumValue -> (Enum) enumValue) + .collect(Collectors.toList()); this.pbType = Checked.checkedInt; } diff --git a/jackson/src/main/java/org/projectnessie/cel/types/jackson/JacksonRegistry.java b/jackson/src/main/java/org/projectnessie/cel/types/jackson/JacksonRegistry.java index 46116c3c..b885c135 100644 --- a/jackson/src/main/java/org/projectnessie/cel/types/jackson/JacksonRegistry.java +++ b/jackson/src/main/java/org/projectnessie/cel/types/jackson/JacksonRegistry.java @@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.EnumSerializer; import com.fasterxml.jackson.databind.type.TypeFactory; import java.util.HashMap; import java.util.Map; @@ -162,19 +161,14 @@ JacksonEnumDescription enumDescription(Class clazz) { } private JacksonEnumDescription computeEnumDescription(Class clazz) { - try { - JsonSerializer ser = serializationProvider.findValueSerializer(clazz); - JavaType javaType = typeFactory.constructType(clazz); + JavaType javaType = typeFactory.constructType(clazz); - JacksonEnumDescription enumDesc = new JacksonEnumDescription(javaType, (EnumSerializer) ser); - enumMap.put(clazz, enumDesc); + JacksonEnumDescription enumDesc = new JacksonEnumDescription(javaType); + enumMap.put(clazz, enumDesc); - enumDesc.buildValues().forEach(v -> enumValues.put(v.fullyQualifiedName(), v)); + enumDesc.buildValues().forEach(v -> enumValues.put(v.fullyQualifiedName(), v)); - return enumDesc; - } catch (JsonMappingException e) { - throw new RuntimeException(e); - } + return enumDesc; } JacksonTypeDescription typeDescription(Class clazz) { diff --git a/jackson/src/test/java/org/projectnessie/cel/types/jackson/Jackson2TypeDescriptionTest.java b/jackson/src/test/java/org/projectnessie/cel/types/jackson/Jackson2TypeDescriptionTest.java index 8a9d0c5c..07dafac2 100644 --- a/jackson/src/test/java/org/projectnessie/cel/types/jackson/Jackson2TypeDescriptionTest.java +++ b/jackson/src/test/java/org/projectnessie/cel/types/jackson/Jackson2TypeDescriptionTest.java @@ -52,6 +52,7 @@ import org.projectnessie.cel.common.types.ref.Val; import org.projectnessie.cel.types.jackson.types.AnEnum; import org.projectnessie.cel.types.jackson.types.CollectionsObject; +import org.projectnessie.cel.types.jackson.types.CustomSerializedEnum; import org.projectnessie.cel.types.jackson.types.EnumWithConstantBody; import org.projectnessie.cel.types.jackson.types.InnerType; @@ -129,6 +130,17 @@ void enumConstantSpecificClassBodyUsesDeclaringClassName() { .isEqualTo(intOf(EnumWithConstantBody.SPECIAL.ordinal())); } + @Test + void customSerializedEnumRegistrationUsesEnumConstants() { + JacksonRegistry reg = (JacksonRegistry) newRegistry(); + reg.enumDescription(CustomSerializedEnum.class); + + assertThat(reg.findIdent(CustomSerializedEnum.class.getName() + ".TWO")) + .isEqualTo(intOf(CustomSerializedEnum.TWO.ordinal())); + assertThat(reg.nativeToValue(CustomSerializedEnum.TWO)) + .isEqualTo(intOf(CustomSerializedEnum.TWO.ordinal())); + } + @Test void types() { JacksonRegistry reg = (JacksonRegistry) newRegistry(); diff --git a/jackson/src/test/java/org/projectnessie/cel/types/jackson/types/CustomSerializedEnum.java b/jackson/src/test/java/org/projectnessie/cel/types/jackson/types/CustomSerializedEnum.java new file mode 100644 index 00000000..caaa17c0 --- /dev/null +++ b/jackson/src/test/java/org/projectnessie/cel/types/jackson/types/CustomSerializedEnum.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2026 The Authors of CEL-Java + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.projectnessie.cel.types.jackson.types; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import java.io.IOException; + +@JsonSerialize(using = CustomSerializedEnum.Serializer.class) +public enum CustomSerializedEnum { + ONE, + TWO; + + public static final class Serializer extends JsonSerializer { + @Override + public void serialize( + CustomSerializedEnum value, JsonGenerator gen, SerializerProvider serializers) + throws IOException { + gen.writeString(value.name()); + } + } +}