2 votes

javax.validation 2.0.1 List<Object> ne fonctionne pas dans spring boot

Je suis nouveau dans le développement de Spring Boot. J'essaie de valider la requête post en passant la liste de @RequestBody. Voici la classe de contrôle

@CrossOrigin
@RestController
@RequestMapping("/webapi/device")
@Validated
public class DeviceController extends AuthControllerImpl{

    @Autowired
    private DeviceServices deviceServices;

    //Test Postman request 01
    @PostMapping(path = "/udateDevices", consumes = MediaType.APPLICATION_JSON,  produces = MediaType.APPLICATION_JSON)
    public ResponseEntity<Object> updateDeviceToDB( @RequestBody List<@Valid Device> device, @RequestParam("token") String token, Errors errors)    {
        if (errors.hasErrors()) {
            return new ResponseEntity<Object>(new ErrorResponse(errors), HttpStatus.BAD_REQUEST);
        }

        if(isValidToken(token) != null){
            DeviceControllerResponse response = deviceServices.updateDeviceToDB(device);
            if (!response.isSuccess()) {
                return new ResponseEntity<Object>(response, HttpStatus.BAD_REQUEST);
            }
            return ResponseEntity.ok(response); 
        }else {
            return new ResponseEntity<Object>("Token has been expired/not valid.", HttpStatus.UNAUTHORIZED);
        }

    }
}

Voici ma classe d'entité.

import javax.validation.constraints.NotEmpty;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "rpDevices")
public class Device {

    @Id
    private String id;

    @NotEmpty(message = "device udid should not be empty")
    private String udid;

    @NotEmpty(message = "deviceModel should not be empty")
    private String deviceModel;

    @NotEmpty(message = "device location should not be empty")
    private String location;

    @NotEmpty(message = "device port should not be empty")
    private String port;

    private String url;

    private String lastUpdate;
    private String imsi;
    private String msisdn;

    private String aliasName;

    public Device() {
        super();
    }

    public Device(String id, String udid, String deviceModel, String location, String port, String url,
            String lastUpdate, String imsi, String msisdn, String aliasName) { 
        this.id = id;
        this.udid = udid;
        this.deviceModel = deviceModel;
        this.location = location;
        this.port = port;
        this.url = url;
        this.lastUpdate = lastUpdate;
        this.imsi = imsi;
        this.msisdn = msisdn;
        this.aliasName = aliasName;
    }
    //Getter and setters 

}

Il ne valide jamais l'entité et donne l'erreur suivante.

    {
    "timestamp": 1591497348682,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "javax.validation.UnexpectedTypeException",
    "message": "HV000030: No validator could be found for constraint 'javax.validation.constraints.NotEmpty' validating type 'java.lang.String'. Check configuration for 'updateDeviceToDB.device[0].port'",
    "path": "/xxxx/webapi/device/udateDevices"
}

Quelqu'un peut-il m'aider à valider la liste directement à partir de la base de données. https://www.baeldung.com/spring-validate-list-controller J'ai essayé, mais sans succès.

voici les dépendances pom

        <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>1.5.21.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <dependencies>

        <!-- Adding spring boot cap -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.restdocs</groupId>
            <artifactId>spring-restdocs-mockmvc</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Adding spring boot security,ldap -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.ldap</groupId>
            <artifactId>spring-ldap-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-ldap</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

        <!-- starter-data-mongodb MongoRepository -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

        <!-- javax.mail -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.5.5</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>

        <!-- some other stuff related to testing -- >

</dependencies>

4voto

HowieChih Points 148

validation-api est la spécification, hibernate-validator est la mise en œuvre, tout simplement.

spring-boot-starter-web importera automatiquement hibernate-validator entonces hibernate-validator importera automatiquement validation-api .

Avec votre configuration de dépendances jar, il y a deux versions de validation-api . L'un d'entre eux est 1.1.0 importé par hibernate-validator 5.3.6 (de spring-boot-starter-web), et l'autre est 2.0.1 importé par votre déclaration explicite. validation-api 2.0.1 sera utilisé avec hibernate-validator 5.3.6 ce qui est incompatible. Ce qui provoque l'erreur "aucun validateur n'a pu être trouvé".

Lorsque vous retirez validation-api 2.0.1 , 1.1.0 sera utilisée. Mais javax.validation.constraints.NotEmpty non introduite avec validation-api 1.1.0 Vous obtiendrez donc une autre erreur.

Il existe plusieurs façons de résoudre ce problème :

  1. supprimer validation-api 2.0.1 , utiliser org.hibernate.validator.constraints.NotEmpty au lieu de javax.validation.constraints.NotEmpty .
  2. supprimer validation-api 2.0.1 Si l'on met à jour la version 2.x de Spring Boot, on utilisera hibernate-validator 6.x et validation-api 2.x.
  3. rester explicite validation-api 2.0.1 déclaration. Ajoutez ensuite une autre déclaration hibernate-validator 6.0.14 déclaration. Ce cas devrait être entièrement testé, car il y a peut-être des problèmes de support de Spring.

1voto

J'ai eu le même problème, si vous utilisez la version de Spring Boot (2.3.0) et plus, alors validation-api ne fonctionne pas.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Il suffit d'ajouter la dépendance ci-dessus dans pom.xml . Voir les notes de mise à jour : https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#validation-starter-no-longer-included-in-web-starters

0voto

MartinBG Points 1

En Errors doit suivre le paramètre validé :

public ResponseEntity<Object> updateDeviceToDB( @RequestBody List<@Valid Device> device, Errors errors, @RequestParam("token") String token) 

Cela est nécessaire pour prendre en charge plusieurs paramètres validés dans une seule méthode.

0voto

public ResponseEntity<Object> updateDeviceToDB(@Valid @RequestBody List<Device> device, @RequestParam("token") String token, Errors errors)

Il est courant de valider un modèle après y avoir intégré les données de l'utilisateur. Spring 3 prend en charge la validation déclarative avec JSR-303. Ce support est activé automatiquement si un fournisseur JSR-303, tel que Hibernate Validator, est présent sur votre classpath. Lorsqu'elle est activée, vous pouvez déclencher la validation simplement en annotant un paramètre de méthode de contrôleur avec l'annotation @Valid :

Visitez ce lien : https://spring.io/blog/2009/11/17/spring-3-type-conversion-and-validation/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X