Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javax.validation 2.0.1列表<;对象>;在弹簧靴中不工作_Java_Spring Boot_Javax.validation - Fatal编程技术网

javax.validation 2.0.1列表<;对象>;在弹簧靴中不工作

javax.validation 2.0.1列表<;对象>;在弹簧靴中不工作,java,spring-boot,javax.validation,Java,Spring Boot,Javax.validation,我是新开发的弹簧靴。我试图通过从@RequestBody传递列表来验证post请求。下面是控制类 @CrossOrigin @RestController @RequestMapping("/webapi/device") @Validated public class DeviceController extends AuthControllerImpl{ @Autowired private DeviceServices deviceServices; //Te

我是新开发的弹簧靴。我试图通过从@RequestBody传递列表来验证post请求。下面是控制类

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

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

    {
    "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"
}
有人能帮助我们直接从请求boday验证列表吗。 我试过了,但没用

以下是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>

org.springframework.boot
spring启动程序父级
1.5.21.发布
进口
聚甲醛
org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧启动机tomcat
假如
org.springframework.boot
弹簧启动装置
假如
org.springframework.restdocs
SpringRestMVC
测试
org.springframework.boot
弹簧启动安全
org.springframework.ldap
SpringLDAP核心
org.springframework.security
spring安全ldap
io.jsonwebtoken
jjwt
0.9.1
org.springframework.boot
spring启动程序数据mongodb
com.sun.mail
javax.mail
1.5.5
javax.validation
验证api
2.0.1.最终版本

错误
参数应跟随已验证的参数:

public ResponseEntity<Object> updateDeviceToDB( @RequestBody List<@Valid Device> device, Errors errors, @RequestParam("token") String token) 
public ResponseEntity updateDeviceToDB(@RequestBody列表设备,错误,@RequestParam(“令牌”)字符串令牌)
为了在一个方法中支持多个已验证的参数,这是必需的。

公共响应属性updateDeviceToDB(@Valid@RequestBody List device,@RequestParam(“token”)字符串token,Errors)
public ResponseEntity<Object> updateDeviceToDB(@Valid @RequestBody List<Device> device, @RequestParam("token") String token, Errors errors)
通常在将用户输入绑定到模型后对其进行验证。Spring3支持JSR-303的声明性验证。如果类路径上存在JSR-303提供程序(如Hibernate Validator),则会自动启用此支持。启用后,只需使用@Valid annotation注释控制器方法参数即可触发验证:


访问此链接:

验证api是规范,hibernate validator是实现,简单地说

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

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

删除
验证api 2.0.1
时,将使用
1.1.0
版本。但是
javax.validation.constraints.NotEmpty
不是在
validation api 1.1.0
中引入的,因此您将得到另一个错误

解决此问题的几种方法:

  • 删除
    验证api 2.0.1
    ,使用
    org.hibernate.validator.constraints.NotEmpty
    而不是
    javax.validation.constraints.NotEmpty
  • 删除
    验证api 2.0.1
    ,将spring boot版本升级到2.x,它将使用hibernate validator 6.x和验证api 2.x
  • 保持显式的
    验证api 2.0.1
    声明。然后添加另一个
    hibernate验证程序6.0.14
    声明。应该对该案例进行全面测试,因为可能存在一些Spring支持问题

  • 我遇到了类似的问题,如果您使用的是spring boot版本(2.3.0)及以上版本,那么
    验证api
    将无法工作

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

    您是否在jar依赖项中明确声明过
    验证api
    hibernate验证程序
    ?如果已声明,请将其删除。验证api和验证器之间存在着复杂的关系。Spring Boot处理得很好。我添加了javax.validation 2.0.1,但我删除了this I can't List declare this and show error not available。请在问题中发布jar依赖项配置文件。添加了pom依赖项使用
    NotBlank
    而不是
    NotEmpty
    你的意思是什么“这是实体类必需的有效选项”是的,我不明白“这是实体类必需的有效选项”。您能解释一下它是什么吗?检查上面编辑的答案。第一个选项:我不能使用此选项,因为validate 1.1.0不支持列表选项。(不支持直接列表验证)第二个选项:这将需要很长时间来修复MongoRepository的兼容问题,其他第三个选项:这工作正常,但您提到的Spring支持问题确实存在。谢谢@HowieChinh@Sri如果您可以使用第1个选项更改请求数据结构,您可能希望这样继续:。如果您不能,请尝试以下操作:使用l不需要额外的异常处理工作。
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>