diff --git a/dmp-backend/core/pom.xml b/dmp-backend/core/pom.xml
index 6c607edd2..4b6344a6e 100644
--- a/dmp-backend/core/pom.xml
+++ b/dmp-backend/core/pom.xml
@@ -48,7 +48,12 @@
org.eclipse.angus
jakarta.mail
-
+
+ commons-beanutils
+ commons-beanutils
+ 1.9.4
+
+
diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneField.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneField.java
new file mode 100644
index 000000000..1c42ea6f4
--- /dev/null
+++ b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneField.java
@@ -0,0 +1,21 @@
+package eu.eudat.commons.validation;
+
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
+
+import java.lang.annotation.*;
+
+@Constraint( validatedBy = { RequiredOneFieldValidator.class } )
+@Documented
+@Target( { ElementType.TYPE } )
+@Retention( RetentionPolicy.RUNTIME )
+public @interface RequiredOneField {
+
+ String message() default "One field is required";
+
+ Class>[] groups() default {};
+
+ Class extends Payload>[] payload() default {};
+
+ String[] fieldNames();
+}
diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneFieldValidator.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneFieldValidator.java
new file mode 100644
index 000000000..6b1cc6c5f
--- /dev/null
+++ b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneFieldValidator.java
@@ -0,0 +1,40 @@
+package eu.eudat.commons.validation;
+
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
+import org.apache.commons.beanutils.PropertyUtils;
+
+
+public class RequiredOneFieldValidator implements ConstraintValidator {
+
+ private String[] fieldNames;
+
+ public void initialize(RequiredOneField constraintAnnotation) {
+ this.fieldNames = constraintAnnotation.fieldNames();
+ }
+
+ public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {
+
+ if (object == null) {
+ return true;
+ }
+ int requiredCount = 0;
+ try {
+ for (String fieldName:fieldNames){
+
+ Object property = PropertyUtils.getProperty(object, fieldName);
+ if (property != null) {
+ requiredCount = requiredCount + 1;
+ }
+ }
+ if (requiredCount == 1){
+ return true;
+ }
+ return false;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+}
+
diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInvitePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInvitePersist.java
index ae25ccc14..9eb8aa670 100644
--- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInvitePersist.java
+++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInvitePersist.java
@@ -3,12 +3,16 @@ package eu.eudat.model.persist;
import eu.eudat.commons.enums.DmpUserRole;
import eu.eudat.commons.validation.ValidEnum;
import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
import java.util.List;
public class DmpUserInvitePersist {
@Valid
+ @NotNull
+ @NotEmpty
private List users;
@ValidEnum(message = "{validation.empty}")
diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java
index eeb0fd899..3d1fd7f4d 100644
--- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java
+++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java
@@ -1,8 +1,10 @@
package eu.eudat.model.persist;
+import eu.eudat.commons.validation.RequiredOneField;
import java.util.UUID;
+@RequiredOneField(fieldNames={"userId","email"})
public class DmpUserInviteTypePersist {
private UUID userId;