You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2015/10/22 14:27:02 UTC

[08/10] syncope git commit: Removing @Column(nullable = false) in favor of @NotNull - better error messages

Removing @Column(nullable = false) in favor of @NotNull - better error messages


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/e20dd0ae
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/e20dd0ae
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/e20dd0ae

Branch: refs/heads/master
Commit: e20dd0ae315244db0f74b29ffe6096760a7536b6
Parents: 9cd9230
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Thu Oct 22 12:22:06 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Thu Oct 22 12:22:06 2015 +0200

----------------------------------------------------------------------
 .../persistence/jpa/entity/AbstractExec.java    |  4 ++--
 .../persistence/jpa/entity/JPAConnInstance.java |  9 +++++----
 .../persistence/jpa/entity/JPADerSchema.java    |  4 ++--
 .../persistence/jpa/entity/JPANotification.java |  4 ++--
 .../persistence/jpa/entity/JPAPlainSchema.java  |  5 +++--
 .../persistence/jpa/entity/JPAVirSchema.java    |  6 +++---
 .../entity/resource/JPAExternalResource.java    | 16 ++++++++--------
 .../jpa/entity/resource/JPAMapping.java         |  4 ++--
 .../jpa/entity/resource/JPAMappingItem.java     | 11 ++++++-----
 .../persistence/jpa/inner/AnyObjectTest.java    |  5 +++++
 .../persistence/jpa/inner/VirSchemaTest.java    | 12 ++++++++++++
 .../java/data/SchemaDataBinderImpl.java         | 20 +++++++++-----------
 .../fit/core/reference/VirSchemaITCase.java     |  9 ++++++++-
 13 files changed, 67 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractExec.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractExec.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractExec.java
index 5c009d4..a9b5c13 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractExec.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractExec.java
@@ -20,11 +20,11 @@ package org.apache.syncope.core.persistence.jpa.entity;
 
 import java.util.Date;
 
-import javax.persistence.Column;
 import javax.persistence.Lob;
 import javax.persistence.MappedSuperclass;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
+import javax.validation.constraints.NotNull;
 import org.apache.syncope.core.persistence.api.entity.Exec;
 
 @MappedSuperclass
@@ -32,7 +32,7 @@ public abstract class AbstractExec extends AbstractEntity<Long> implements Exec
 
     private static final long serialVersionUID = -812344822970166317L;
 
-    @Column(nullable = false)
+    @NotNull
     protected String status;
 
     /**

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
index 3929496..054dd69 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
@@ -36,6 +36,7 @@ import javax.persistence.JoinColumn;
 import javax.persistence.Lob;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
@@ -63,7 +64,7 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
     /**
      * URI identifying the local / remote ConnId location where the related connector bundle is found.
      */
-    @Column(nullable = false)
+    @NotNull
     private String location;
 
     /**
@@ -71,7 +72,7 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
      * Within a given location, the triple
      * (ConnectorBundle-Name, ConnectorBundle-Version, ConnectorBundle-Version) must be unique.
      */
-    @Column(nullable = false)
+    @NotNull
     private String connectorName;
 
     /**
@@ -79,7 +80,7 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
      * Within a given location, the triple
      * (ConnectorBundle-Name, ConnectorBundle-Version, ConnectorBundle-Version) must be unique.
      */
-    @Column(nullable = false)
+    @NotNull
     private String bundleName;
 
     /**
@@ -87,7 +88,7 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
      * Within a given location, the triple
      * (ConnectorBundle-Name, ConnectorBundle-Version, ConnectorBundle-Version) must be unique.
      */
-    @Column(nullable = false)
+    @NotNull
     private String version;
 
     /**

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
index 944afc4..45eea22 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
@@ -19,12 +19,12 @@
 package org.apache.syncope.core.persistence.jpa.entity;
 
 import javax.persistence.Cacheable;
-import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
@@ -46,7 +46,7 @@ public class JPADerSchema extends AbstractEntity<String> implements DerSchema {
     @OneToOne(fetch = FetchType.EAGER)
     private JPAAnyTypeClass anyTypeClass;
 
-    @Column(nullable = false)
+    @NotNull
     private String expression;
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
index 7e3d211..1c42cf0 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
@@ -84,7 +84,7 @@ public class JPANotification extends AbstractEntity<Long> implements Notificatio
     @NotNull
     private String recipientAttrName;
 
-    @Column(nullable = false)
+    @NotNull
     @Basic
     @Min(0)
     @Max(1)
@@ -103,7 +103,7 @@ public class JPANotification extends AbstractEntity<Long> implements Notificatio
     @Enumerated(EnumType.STRING)
     private TraceLevel traceLevel;
 
-    @Column(nullable = false)
+    @NotNull
     @Basic
     @Min(0)
     @Max(1)

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
index 68eeacf..4ba6fa3 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
@@ -32,6 +32,7 @@ import javax.persistence.Table;
 import javax.persistence.Transient;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
@@ -58,11 +59,11 @@ public class JPAPlainSchema extends AbstractEntity<String> implements PlainSchem
     @OneToOne(fetch = FetchType.EAGER)
     private JPAAnyTypeClass anyTypeClass;
 
-    @Column(nullable = false)
+    @NotNull
     @Enumerated(EnumType.STRING)
     private AttrSchemaType type;
 
-    @Column(nullable = false)
+    @NotNull
     private String mandatoryCondition;
 
     @Basic

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
index b984bb3..419e93a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
@@ -22,7 +22,6 @@ import java.util.Collections;
 import java.util.List;
 import javax.persistence.Basic;
 import javax.persistence.Cacheable;
-import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
@@ -31,6 +30,7 @@ import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.common.lib.types.IntMappingType;
 import org.apache.syncope.common.lib.types.MappingPurpose;
@@ -63,11 +63,11 @@ public class JPAVirSchema extends AbstractEntity<String> implements VirSchema {
     @Max(1)
     private Integer readonly;
 
-    @Column(nullable = false)
+    @NotNull
     @ManyToOne
     private JPAProvision provision;
 
-    @Column(nullable = false)
+    @NotNull
     private String extAttrName;
 
     public JPAVirSchema() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
index e9e59fd..de3931e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
@@ -82,7 +82,7 @@ public class JPAExternalResource extends AbstractAnnotatedEntity<String> impleme
     /**
      * Should this resource enforce the mandatory constraints?
      */
-    @Column(nullable = false)
+    @NotNull
     @Basic
     @Min(0)
     @Max(1)
@@ -101,7 +101,7 @@ public class JPAExternalResource extends AbstractAnnotatedEntity<String> impleme
     /**
      * Is this resource primary, for propagations?
      */
-    @Column(nullable = false)
+    @NotNull
     @Basic
     @Min(0)
     @Max(1)
@@ -110,32 +110,32 @@ public class JPAExternalResource extends AbstractAnnotatedEntity<String> impleme
     /**
      * Priority index for propagation ordering.
      */
-    @Column(nullable = false)
+    @NotNull
     private Integer propagationPriority;
 
     /**
      * Generate random password for propagation, if not provided?
      */
-    @Column(nullable = false)
+    @NotNull
     @Basic
     @Min(0)
     @Max(1)
     private Integer randomPwdIfNotProvided;
 
     @Enumerated(EnumType.STRING)
-    @Column(nullable = false)
+    @NotNull
     private TraceLevel createTraceLevel;
 
     @Enumerated(EnumType.STRING)
-    @Column(nullable = false)
+    @NotNull
     private TraceLevel updateTraceLevel;
 
     @Enumerated(EnumType.STRING)
-    @Column(nullable = false)
+    @NotNull
     private TraceLevel deleteTraceLevel;
 
     @Enumerated(EnumType.STRING)
-    @Column(nullable = false)
+    @NotNull
     private TraceLevel syncTraceLevel;
 
     @ManyToOne(fetch = FetchType.EAGER)

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
index 2d7af3c..872fee7 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
@@ -22,13 +22,13 @@ import java.util.ArrayList;
 import java.util.List;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
-import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.IntMappingType;
@@ -49,7 +49,7 @@ public class JPAMapping extends AbstractEntity<Long> implements Mapping {
     @Id
     private Long id;
 
-    @Column(nullable = false)
+    @NotNull
     @OneToOne
     private JPAProvision provision;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java
index 8dba286..c3ee73b 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java
@@ -35,6 +35,7 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
 import org.apache.syncope.common.lib.types.IntMappingType;
 import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
@@ -59,7 +60,7 @@ public class JPAMappingItem extends AbstractEntity<Long> implements MappingItem
     @Column(nullable = true)
     private String intAttrName;
 
-    @Column(nullable = false)
+    @NotNull
     @Enumerated(EnumType.STRING)
     private IntMappingType intMappingType;
 
@@ -72,13 +73,13 @@ public class JPAMappingItem extends AbstractEntity<Long> implements MappingItem
     /**
      * Specify if the mapped target resource's field is nullable.
      */
-    @Column(nullable = false)
+    @NotNull
     private String mandatoryCondition;
 
     /**
      * Specify if the mapped target resource's field is the key.
      */
-    @Column(nullable = false)
+    @NotNull
     @Basic
     @Min(0)
     @Max(1)
@@ -87,13 +88,13 @@ public class JPAMappingItem extends AbstractEntity<Long> implements MappingItem
     /**
      * Specify if the mapped target resource's field is the password.
      */
-    @Column(nullable = false)
+    @NotNull
     @Basic
     @Min(0)
     @Max(1)
     private Integer password;
 
-    @Column(nullable = false)
+    @NotNull
     @Enumerated(EnumType.STRING)
     private MappingPurpose purpose;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
index cd6b535..943a94f 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertTrue;
 import java.util.List;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.jpa.AbstractTest;
@@ -37,6 +38,9 @@ import org.springframework.transaction.annotation.Transactional;
 public class AnyObjectTest extends AbstractTest {
 
     @Autowired
+    private AnyTypeDAO anyTypeDAO;
+
+    @Autowired
     private AnyObjectDAO anyObjectDAO;
 
     @Autowired
@@ -68,6 +72,7 @@ public class AnyObjectTest extends AbstractTest {
     @Test
     public void save() {
         AnyObject anyObject = entityFactory.newEntity(AnyObject.class);
+        anyObject.setType(anyTypeDAO.find("PRINTER"));
         anyObject.setRealm(realmDAO.find(SyncopeConstants.ROOT_REALM));
 
         anyObject = anyObjectDAO.save(anyObject);

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
index 66bd6cb..19193dd 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
@@ -27,9 +27,13 @@ import static org.junit.Assert.fail;
 import java.util.List;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
+import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
+import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.jpa.AbstractTest;
+import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -40,6 +44,9 @@ public class VirSchemaTest extends AbstractTest {
     @Autowired
     private VirSchemaDAO virSchemaDAO;
 
+    @Autowired
+    private ExternalResourceDAO resourceDAO;
+
     @Test
     public void findAll() {
         List<VirSchema> list = virSchemaDAO.findAll();
@@ -54,8 +61,13 @@ public class VirSchemaTest extends AbstractTest {
 
     @Test
     public void save() {
+        ExternalResource csv = resourceDAO.find("resource-csv");
+        Provision provision = csv.getProvision(ObjectClass.ACCOUNT);
+        assertNotNull(provision);
+
         VirSchema virSchema = entityFactory.newEntity(VirSchema.class);
         virSchema.setKey("virtual");
+        virSchema.setProvision(provision);
         virSchema.setReadonly(true);
         virSchema.setExtAttrName("EXT_ATTR");
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
index 006a998..6e9837f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
@@ -221,23 +221,21 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
     private VirSchema fill(final VirSchema schema, final VirSchemaTO schemaTO) {
         BeanUtils.copyProperties(schemaTO, schema, IGNORE_PROPERTIES);
 
-        VirSchema merged = virSchemaDAO.save(schema);
-
         if (schemaTO.getAnyTypeClass() != null
-                && (merged.getAnyTypeClass() == null
-                || !schemaTO.getAnyTypeClass().equals(merged.getAnyTypeClass().getKey()))) {
+                && (schema.getAnyTypeClass() == null
+                || !schemaTO.getAnyTypeClass().equals(schema.getAnyTypeClass().getKey()))) {
 
             AnyTypeClass anyTypeClass = anyTypeClassDAO.find(schemaTO.getAnyTypeClass());
             if (anyTypeClass == null) {
                 LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName()
                         + "{}, ignoring...", schemaTO.getAnyTypeClass());
             } else {
-                anyTypeClass.add(merged);
-                merged.setAnyTypeClass(anyTypeClass);
+                anyTypeClass.add(schema);
+                schema.setAnyTypeClass(anyTypeClass);
             }
-        } else if (schemaTO.getAnyTypeClass() == null && merged.getAnyTypeClass() != null) {
-            merged.getAnyTypeClass().remove(merged);
-            merged.setAnyTypeClass(null);
+        } else if (schemaTO.getAnyTypeClass() == null && schema.getAnyTypeClass() != null) {
+            schema.getAnyTypeClass().remove(schema);
+            schema.setAnyTypeClass(null);
         }
 
         Provision provision = resourceDAO.findProvision(schemaTO.getProvision());
@@ -246,9 +244,9 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
             sce.getElements().add("Provision " + schemaTO.getProvision() + " not found");
             throw sce;
         }
-        merged.setProvision(provision);
+        schema.setProvision(provision);
 
-        return merged;
+        return virSchemaDAO.save(schema);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e20dd0ae/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirSchemaITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirSchemaITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirSchemaITCase.java
index caae156..c4e4ea0 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirSchemaITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirSchemaITCase.java
@@ -112,8 +112,15 @@ public class VirSchemaITCase extends AbstractITCase {
 
     @Test
     public void issueSYNCOPE418() {
+        ResourceTO ws1 = resourceService.read(RESOURCE_NAME_WS1);
+        assertNotNull(ws1);
+        assertEquals(1, ws1.getProvisions().size());
+        assertTrue(ws1.getProvisions().get(0).getVirSchemas().isEmpty());
+
         VirSchemaTO schema = new VirSchemaTO();
         schema.setKey("http://schemas.examples.org/security/authorization/organizationUnit");
+        schema.setExtAttrName("name");
+        schema.setProvision(ws1.getProvisions().get(0).getKey());
 
         try {
             createSchema(SchemaType.VIRTUAL, schema);
@@ -121,7 +128,7 @@ public class VirSchemaITCase extends AbstractITCase {
         } catch (SyncopeClientException e) {
             assertEquals(ClientExceptionType.InvalidVirSchema, e.getType());
 
-            assertTrue(e.getElements().iterator().next().toString().contains(EntityViolationType.InvalidName.name()));
+            assertTrue(e.getElements().iterator().next().contains(EntityViolationType.InvalidName.name()));
         }
     }
 }