Comment déclencher manuellement la validation du ressort?


La validation spring annotée sur les champs d'un POJO fonctionne lorsqu'elle est créée à partir du corps de la requête json. Cependant, lorsque je crée le même objet manuellement (à l'aide de setters) et que je veux déclencher la validation, je ne sais pas comment le faire.

Voici la classe Registration, qui a une classe interne Builder qui peut construire l'objet. Dans la méthode de construction, je voudrais déclencher la validation spring. Veuillez faire défiler vers le bas et vérifier Builder.build() et le Constructeur.valiate () méthodes pour voir le courant application. Je suis en utilisant javax.validation.Validateur pour déclencher la validation, mais je préfère tirer parti de la validation spring si possible.

package com.projcore.dao;

import com.projcore.util.ToString;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.hibernate.validator.constraints.NotEmpty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.validation.ConstraintViolation;
import javax.validation.Valid;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.constraints.Size;
import java.util.List;
import java.util.Set;

/**
 * The data transfer object that contains the information of a Registration
 * and validation rules for attributes.
 */
@JsonIgnoreProperties(ignoreUnknown = true)
public final class Registration {
    private static final Logger LOGGER = LoggerFactory.getLogger(Registration.class);

    private String id;

    @NotEmpty
    @Size(max = 255)
    private String messageId;

    @NotEmpty
    @Size(max = 255)
    private String version;

    @Size(max = 255)
    private String system;

    public Registration() {
    }

    private Registration(Builder builder) {
        this.id = builder.id;
        this.messageId = builder.messageId;
        this.version = builder.version;
        this.system = builder.system;
    }

    public static Builder getBuilder() {
        return new Builder();
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getMessageId() {
        return messageId;
    }

    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getSystem() {
        return system;
    }

    public void setSystem(String system) {
        this.system = system;
    }

    @Override
    public String toString() {
        return ToString.create(this);
    }

    /**
     * Builder pattern makes the object easier to construct in one line.
     */
    public static class Builder {

        private String id;

        private String messageId;

        private String version;

        private String system;

        private Builder() {}

        public Builder id(String id) {
            this.id = id;
            return this;
        }

        public Builder messageId(String messageId) {
            this.messageId = messageId;
            return this;
        }


        public Builder version(String version) {
            this.version = version;
            return this;
        }

        public Builder system(String system) {
            this.system = system;
            return this;
        }

        public Registration build() {
            Registration entry = new Registration(this);

            // *** Would like to trigger spring validation here ***
            Set violations = validate(entry);
            if (violations.isEmpty())
                return entry;
            else
                throw new RuntimeException(violations.toString());
        }

        private Set validate(Registration entry) {
            Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
            Set<ConstraintViolation<Registration>> constraintViolations = validator.validate(entry);
            return constraintViolations;
        }

    }
}

La validation fonctionne bien ici:

@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
Registration create(@RequestBody @Valid Registration registration) 

Solution:

Inscription supprimée.Constructeur.valider(). Mise À Jour Registraion.Constructeur.construire () à:

    public Registration build() {
        Registration entry = new Registration(this);
        return (Registration) ValidatorUtil.validate(entry);
    }

ValidationUtil.java

package projcore.util;

import com.ericsson.admcore.error.InvalidDataException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;
import org.springframework.validation.beanvalidation.SpringValidatorAdapter;

import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;

public class ValidatorUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(ValidatorUtil.class);
    private static final Validator javaxValidator = Validation.buildDefaultValidatorFactory().getValidator();
    private static final SpringValidatorAdapter validator = new SpringValidatorAdapter(javaxValidator);

    public static Object validate(Object entry) {
        Errors errors = new BeanPropertyBindingResult(entry, entry.getClass().getName());
        validator.validate(entry, errors);
        if (errors == null || errors.getAllErrors().isEmpty())
            return entry;
        else {
            LOGGER.error(errors.toString());
            throw new InvalidDataException(errors.getAllErrors().toString(), errors);
        }
    }
}

InvalidDataException.java

package projcore.error;

import org.springframework.validation.Errors;

/**
 * This exception is thrown when the dao has invalid data.
 */
public class InvalidDataException extends RuntimeException {
    private Errors errors;

    public InvalidDataException(String msg, Errors errors) {
        super(msg);
        setErrors(errors);
    }

    public Errors getErrors() {
        return errors;
    }

    public void setErrors(Errors errors) {
        this.errors = errors;
    }
}
Author: Srini K, 2015-02-24

1 answers

Spring fournit une prise en charge complète de l'API de validation de bean JSR-303. Cela inclut un support pratique pour l'amorçage d'une implémentation JSR-303 en tant que Spring bean. Cela permet un javax.validation.Validateur à injecter partout où la validation est nécessaire dans votre application.

Utilisez LocalValidatorFactoryBean pour configurer un validateur JSR-303 par défaut en tant que bean Spring:

   <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

La configuration de base ci-dessus déclenchera JSR-303 pour initialiser en utilisant son bootstrap par défaut mécanisme. Un fournisseur JSR - 303, tel que Hibernate Validator, devrait être présent dans le classpath et sera détecté automatiquement.

5.7.2.1 Injection d'un validateur

LocalValidatorFactoryBean implements both javax.validation.Validator and org.springframework.validation.Validator. Vous pouvez injecter une référence à l'une de ces deux interfaces dans les beans qui doivent invoquer la logique de validation.

Injectez une référence à javax.validation.Validator si vous préférez travailler directement avec l'API JSR-303:

// JSR-303 Validator
import javax.validation.Validator;

@Service
public class MyService {

    @Autowired
    private Validator validator;

}

Injectez une référence à org.springframework.validation.Validator si votre bean nécessite la validation Spring API:

// Spring Validator
import org.springframework.validation.Validator;

@Service
public class MyService {

    @Autowired
    private Validator validator;

}

Voici un bien exaplained exemple Utilisation de JSR 303 avec des validateurs Spring" classiques " (entrez le SpringValidatorAdapter)

Ce lien est très utile. Emballage javax.validation.Validateur org.springframework.validation.beanvalidation.SpringValidatorAdapter aidé à gérer les erreurs de manière cohérente. Pouvez-vous ajouter ceci comme réponse alors que je peux l'accepter

Et Printemps doc ici

 16
Author: iamiddy, 2016-11-02 02:19:24