diff --git a/src/main/java/com/github/sabomichal/immutablexjc/PluginImpl.java b/src/main/java/com/github/sabomichal/immutablexjc/PluginImpl.java index 3ee93f1..a6b2b79 100644 --- a/src/main/java/com/github/sabomichal/immutablexjc/PluginImpl.java +++ b/src/main/java/com/github/sabomichal/immutablexjc/PluginImpl.java @@ -48,6 +48,7 @@ import com.sun.tools.xjc.outline.Outline; import jakarta.xml.bind.annotation.XmlAttribute; import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlValue; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.reflect.FieldUtils; import org.xml.sax.ErrorHandler; @@ -340,7 +341,7 @@ private JMethod addBuildMethod(JDefinedClass clazz, JDefinedClass builderClass, } for (JFieldVar field : declaredFields) { if (mustAssign(field)) { - if (isRequired(field)) { + if (isRequired(field) && !field.type().isPrimitive()) { JBlock block = method.body(); JConditional conditional = block._if(field.eq(JExpr._null())); conditional._then()._throw(JExpr._new(builderClass.owner().ref(NullPointerException.class)) @@ -938,6 +939,14 @@ private boolean isMap(JClass clazz) { } private boolean isRequired(JFieldVar field) { + if (field.type().isPrimitive()) { + return true; + } + + if (getAnnotation(field.annotations(), XmlValue.class.getCanonicalName()).isPresent()) { + return true; + } + return Stream.of(XmlElement.class, XmlAttribute.class) .map(annotationType -> getAnnotation(field.annotations(), annotationType.getCanonicalName()) diff --git a/src/test/java/com/github/sabomichal/immutablexjc/test/TestMiscOptions.java b/src/test/java/com/github/sabomichal/immutablexjc/test/TestMiscOptions.java index 52b974d..6d6687a 100644 --- a/src/test/java/com/github/sabomichal/immutablexjc/test/TestMiscOptions.java +++ b/src/test/java/com/github/sabomichal/immutablexjc/test/TestMiscOptions.java @@ -4,11 +4,15 @@ import com.github.sabomichal.immutablexjc.test.misc.Model; import com.github.sabomichal.immutablexjc.test.misc.NameExpression; import com.github.sabomichal.immutablexjc.test.misc.Parameters; +import com.github.sabomichal.immutablexjc.test.optionalgetter.DecimalExtensionType; +import com.github.sabomichal.immutablexjc.test.optionalgetter.NoOptionalForPrimitive; import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.Marshaller; import org.junit.jupiter.api.Test; +import java.math.BigDecimal; + import static org.junit.jupiter.api.Assertions.*; @@ -100,5 +104,14 @@ public void testOptionalGetter() { assertTrue(new com.github.sabomichal.immutablexjc.test.optionalgetter.Declaration(null, null, null, "documentation", null) .getDocumentation() .isPresent()); + + DecimalExtensionType type = new DecimalExtensionType(BigDecimal.valueOf(1), "s"); + assertNotNull(type.getValue()); + assertEquals(BigDecimal.class, type.getValue().getClass()); + assertTrue(type.getUnit().isPresent()); + + NoOptionalForPrimitive primitive = new NoOptionalForPrimitive(1); + assertNotNull(primitive.getIndex()); + assertEquals(1, primitive.getIndex()); } } diff --git a/src/test/xsd/basic.xsd b/src/test/xsd/basic.xsd index 62f4480..e9f620b 100644 --- a/src/test/xsd/basic.xsd +++ b/src/test/xsd/basic.xsd @@ -37,4 +37,23 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file