diff --git a/annot/src/main/java/com/predic8/membrane/annot/generator/kubernetes/model/SchemaObject.java b/annot/src/main/java/com/predic8/membrane/annot/generator/kubernetes/model/SchemaObject.java
index 37f174af55..61b82be03a 100644
--- a/annot/src/main/java/com/predic8/membrane/annot/generator/kubernetes/model/SchemaObject.java
+++ b/annot/src/main/java/com/predic8/membrane/annot/generator/kubernetes/model/SchemaObject.java
@@ -14,6 +14,7 @@
package com.predic8.membrane.annot.generator.kubernetes.model;
import com.fasterxml.jackson.databind.node.*;
+import org.jetbrains.annotations.NotNull;
import java.util.*;
@@ -148,11 +149,22 @@ private void addProperties(ObjectNode node) {
private static ObjectNode createPropertyNode(AbstractSchema> property) {
ObjectNode propertyNode = property.json(jnf.objectNode());
if (property.getEnumValues() != null && !property.getEnumValues().isEmpty()) {
- propertyNode.set("enum", getEnumNode(property));
+ propertyNode = createEnumNode(property, propertyNode);
}
return propertyNode;
}
+ private static @NotNull ObjectNode createEnumNode(AbstractSchema> property, ObjectNode propertyNode) {
+ ObjectNode unlimitedNode = propertyNode.deepCopy(); // a string (unrestricted)
+ ObjectNode limitedNode = propertyNode; // a string restricted by 'enum'
+ limitedNode.set("enum", getEnumNode(property));
+ propertyNode = jnf.objectNode();
+ // The 'anyOf' construction will suggest the pre-defined enum values (lowercase enum values) but allow other
+ // spellings.
+ propertyNode.set("anyOf", jnf.arrayNode().add(limitedNode).add(unlimitedNode));
+ return propertyNode;
+ }
+
private static ArrayNode getEnumNode(AbstractSchema> property) {
var enumValues = jnf.arrayNode();
property.getEnumValues().forEach(enumValues::add);
diff --git a/annot/src/test/java/com/predic8/membrane/annot/SpringEnumParsingTest.java b/annot/src/test/java/com/predic8/membrane/annot/SpringEnumParsingTest.java
new file mode 100644
index 0000000000..458c8ee241
--- /dev/null
+++ b/annot/src/test/java/com/predic8/membrane/annot/SpringEnumParsingTest.java
@@ -0,0 +1,53 @@
+package com.predic8.membrane.annot;
+
+import com.predic8.membrane.annot.beanregistry.BeanRegistry;
+import com.predic8.membrane.annot.util.CompilerHelper;
+import com.predic8.membrane.annot.util.CompilerResult;
+import org.junit.jupiter.api.Test;
+
+import static com.predic8.membrane.annot.SpringConfigurationXSDGeneratingAnnotationProcessorTest.MC_MAIN_DEMO;
+import static com.predic8.membrane.annot.util.CompilerHelper.*;
+import static com.predic8.membrane.annot.util.StructureAssertionUtil.*;
+
+public class SpringEnumParsingTest {
+
+ private static final String TRIVIAL_ENUM_EXAMPLE = """
+ package com.predic8.membrane.demo;
+ import com.predic8.membrane.annot.*;
+ import java.util.List;
+ @MCElement(name="root")
+ public class DemoElement {
+ MyEnum value;
+
+ public MyEnum getValue() { return value; }
+ @MCAttribute
+ public void setValue(MyEnum value) { this.value = value; }
+ }
+ ---
+ package com.predic8.membrane.demo;
+ public enum MyEnum {
+ VALUE1, VALUE2;
+ }
+ """;
+
+ @Test
+ public void checkEnumParsing() {
+ var sources = splitSources(MC_MAIN_DEMO + TRIVIAL_ENUM_EXAMPLE);
+ var result = CompilerHelper.compile(sources, false);
+ assertCompilerResult(true, result);
+
+ assertThatXMLValueWasTranslatedTo(result, "VALUE1", "VALUE1");
+ assertThatXMLValueWasTranslatedTo(result, "value1", "VALUE1");
+ }
+
+ private static void assertThatXMLValueWasTranslatedTo(CompilerResult result, String xmlValue, String expectedToStringValue) {
+ BeanRegistry br = parseXML(result, SpringParsingTest.wrapSpring("""
+ """.formatted(xmlValue)));
+
+ assertStructure(
+ br,
+ clazz("DemoElement",
+ property("value", convertedToString(expectedToStringValue))));
+ }
+
+}
diff --git a/annot/src/test/java/com/predic8/membrane/annot/ParsingTest.java b/annot/src/test/java/com/predic8/membrane/annot/SpringParsingTest.java
similarity index 98%
rename from annot/src/test/java/com/predic8/membrane/annot/ParsingTest.java
rename to annot/src/test/java/com/predic8/membrane/annot/SpringParsingTest.java
index ba3e92d850..be04d24cd4 100644
--- a/annot/src/test/java/com/predic8/membrane/annot/ParsingTest.java
+++ b/annot/src/test/java/com/predic8/membrane/annot/SpringParsingTest.java
@@ -17,7 +17,6 @@
import com.predic8.membrane.annot.beanregistry.BeanRegistry;
import com.predic8.membrane.annot.beanregistry.SpringContextAdapter;
import com.predic8.membrane.annot.util.CompilerHelper;
-import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.ConfigurableApplicationContext;
@@ -28,9 +27,9 @@
import static com.predic8.membrane.annot.util.StructureAssertionUtil.*;
import static com.predic8.membrane.annot.util.StructureAssertionUtil.clazz;
-public class ParsingTest {
+public class SpringParsingTest {
- private String wrapSpring(String content) {
+ public static String wrapSpring(String content) {
return """
Assertions.assertEquals(value, bean);
}
+ public static Asserter isNull() {
+ return bean -> Assertions.assertNull(bean);
+ }
+
+ public static Asserter convertedToString(String value) {
+ return bean -> Assertions.assertEquals(value, bean.toString());
+ }
+
public static Asserter list(Asserter... asserters) {
return bean -> {
assertInstanceOf(List.class, bean);