diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php
index 34c6ee54b5..12556e6b67 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php
@@ -37,6 +37,13 @@ class ValidReferenceConstraint extends Constraint {
    */
   public $invalidAutocreateMessage = 'This entity (%type: %label) cannot be referenced.';
 
+  /**
+   * Violation message when a new entity doesn't pass the validation.
+   *
+   * @var string
+   */
+  public $invalidNewEntity = 'This entity (%type: %label) cannot be created. Reason(s): "%reason".';
+
   /**
    * Violation message when the target_id is empty.
    *
diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php
index aef9fb0018..8687806ded 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface;
 use Drupal\Core\Entity\EntityReferenceSelection\SelectionWithAutocreateInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Field\EntityReferenceFieldItemList;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\Validator\Constraint;
 use Symfony\Component\Validator\ConstraintValidator;
@@ -102,6 +103,43 @@ public function validate($value, Constraint $constraint) {
       if ($handler instanceof SelectionWithAutocreateInterface) {
         $valid_new_entities = $handler->validateReferenceableNewEntities($new_entities);
         $invalid_new_entities = array_diff_key($new_entities, $valid_new_entities);
+
+        // The entities which could be created should run through the entity
+        // validation before being saved.
+        foreach ($valid_new_entities as $delta => $entity) {
+          $violations = $entity->getTypedData()->validate();
+          if ($violations->count() != 0) {
+            // Concatenate the violations to show them as a single violation.
+            $reasons = [];
+            foreach ($violations as $violation) {
+              $reasons[] = $violation->getMessage();
+            }
+            $reasons = implode("\n", $reasons);
+
+            $entity_type = $entity->getEntityType();
+            $type_label = $entity_type->getLabel();
+            // If the entity supports bundles, then add the bundle label to the
+            // type label.
+            if ($entity_type->hasKey('bundle')) {
+              /** @var \Drupal\Core\Field\FieldItemListInterface $bundle_field */
+              $bundle_field = $entity->{$entity_type->getKey('bundle')};
+              if ($bundle_field instanceof EntityReferenceFieldItemList) {
+                $type_label .= ' ' . $bundle_field->entity->label();
+              }
+              else {
+                $type_label .= ' ' .$bundle_field->getString();
+              }
+            }
+            // Add the reason for the validation failure to the current context.
+            $this->context->buildViolation($constraint->invalidNewEntity)
+              ->setParameter('%type', $type_label)
+              ->setParameter('%label', $entity->label())
+              ->setParameter('%reason', $reasons)
+              ->atPath((string) $delta . '.entity')
+              ->setInvalidValue($entity)
+              ->addViolation();
+          }
+        }
       }
       else {
         // If the selection handler does not support referencing newly created
diff --git a/core/lib/Drupal/Core/Validation/ConstraintValidatorFactory.php b/core/lib/Drupal/Core/Validation/ConstraintValidatorFactory.php
index 4602c206fb..859edc0e0d 100644
--- a/core/lib/Drupal/Core/Validation/ConstraintValidatorFactory.php
+++ b/core/lib/Drupal/Core/Validation/ConstraintValidatorFactory.php
@@ -25,12 +25,13 @@ public function __construct(ClassResolverInterface $class_resolver) {
    */
   public function getInstance(Constraint $constraint) {
     $class_name = $constraint->validatedBy();
-
-    if (!isset($this->validators[$class_name])) {
-      $this->validators[$class_name] = $this->classResolver->getInstanceFromDefinition($class_name);
-    }
-
-    return $this->validators[$class_name];
+    // Constraint validator instances should always be initialized newly and
+    // never shared, because the current validation context is getting injected
+    // into them and in a case of a recursive validation where a validator
+    // triggers a validation chain leading to the same validator the context of
+    // the first call would be exchanged with the one of the subsequent
+    // validation chain.
+    return $this->classResolver->getInstanceFromDefinition($class_name);
   }
 
 }
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/ValidReferenceConstraintValidatorTest.php b/core/tests/Drupal/KernelTests/Core/Entity/ValidReferenceConstraintValidatorTest.php
index 3f182c91e8..be58600d8c 100644
--- a/core/tests/Drupal/KernelTests/Core/Entity/ValidReferenceConstraintValidatorTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Entity/ValidReferenceConstraintValidatorTest.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\entity_test\Entity\EntityTest;
+use Drupal\entity_test\Entity\EntityTestConstraintViolation;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait;
 use Drupal\node\Entity\Node;
@@ -231,4 +232,41 @@ public function testPreExistingItemsValidation() {
     ]), $violations[1]->getMessage());
   }
 
+  /**
+   * Tests the validation of new entities on an entity reference field.
+   */
+  public function testNewEntitiesValidation() {
+    $this->installEntitySchema('entity_test_constraint_violation');
+
+    // Add an entity reference field.
+    $this->createEntityReferenceField(
+      'entity_test',
+      'entity_test',
+      'field_test',
+      'Field test',
+      'entity_test_constraint_violation',
+      'default',
+      ['target_bundles' => ['entity_test_constraint_violation']],
+      FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED
+    );
+
+    // Create a new entity which will be referenced and should fail the
+    // validation.
+    $referenced_new_entity = EntityTestConstraintViolation::create([]);
+
+    $referencing_entity = EntityTest::create([
+      'field_test' => [
+        ['entity' => $referenced_new_entity],
+      ]
+    ]);
+
+    $violations = $referencing_entity->field_test->validate();
+    $this->assertCount(1, $violations);
+    $this->assertEquals(t('This entity (%type: %label) cannot be created. Reason(s): "%reason".', [
+      '%type' => $referenced_new_entity->getEntityType()->getLabel() . ' ' . $referenced_new_entity->type->entity->label(),
+      '%label' => $referenced_new_entity->label(),
+      '%reason' => 'Widget constraint has failed.',
+    ]), $violations[0]->getMessage());
+  }
+
 }
