javax.validation 2.0.1 List <Object>在Spring Boot中不起作用

我是春季靴子开发的新手。我试图通过传递@RequestBody中的List来验证发布请求。下面是控件类

@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);
        }

    }
}

下面是我的实体类。

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 

}

它从不验证实体并给出以下错误。

    {
    "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"
}

有人可以帮助如何直接从请求日期开始验证列表。 https://www.baeldung.com/spring-validate-list-controller我尝试了这个,但没有帮助。

这是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>
iCMS 回答:javax.validation 2.0.1 List <Object>在Spring Boot中不起作用

简单地说,

validation-api 是规范, hibernate-validator 是实现。

spring-boot-starter-web 将自动导入 hibernate-validator ,然后 hibernate-validator 将自动导入验证- api

在jar依赖项配置中,validation-api有两个版本。一个是由1.1.0导入的hibernate-validator 5.3.6(从spring-boot-starter-web),另一个是2.0.1由您的显式声明导入。 validation-api 2.0.1将与不兼容的hibernate-validator 5.3.6一起使用。找不到导致验证器的错误。

删除validation-api 2.0.1时,将使用1.1.0版本。但是javax.validation.constraints.NotEmpty中没有引入validation-api 1.1.0,因此您会遇到另一个错误。

解决此问题的几种方法:

  1. 删除validation-api 2.0.1,使用org.hibernate.validator.constraints.NotEmpty代替javax.validation.constraints.NotEmpty
  2. 删除validation-api 2.0.1,将spring boot版本升级到2.x,它将使用hibernate-validator 6.x和validation-api 2.x。
  3. 保留您明确的validation-api 2.0.1声明。然后添加另一个hibernate-validator 6.0.14声明。这种情况应该经过充分测试,因为可能存在一些Spring支持问题。
,

我遇到了类似的问题,如果您使用的是Spring Boot版本(2.3.0)及更高版本,那么validation-api将无法正常工作。

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

只需在pom.xml中添加以上依赖项即可。 请参阅发行说明:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#validation-starter-no-longer-included-in-web-starters

,

Errors参数应遵循经过验证的参数:

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

这是为了在单个方法中支持多个经过验证的参数所必需的。

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

通常在将用户输入绑定到模型之后验证模型。 Spring 3支持使用JSR-303进行声明式验证。如果您的类路径中存在JSR-303提供程序(例如Hibernate Validator),则会自动启用此支持。启用后,您可以简单地通过使用@Valid注释对Controller方法参数进行注释来触发验证:

访问此链接:https://spring.io/blog/2009/11/17/spring-3-type-conversion-and-validation/

本文链接:https://www.f2er.com/2187229.html

大家都在问