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