当前位置: 首页 > 知识库问答 >
问题:

javax.validation2.0.1列表不工作在Spring启动

羊和光
2023-03-14

我是Spring启动开发的新手。我正在尝试通过从@Request estbody传递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"
}

有人可以帮助如何验证列表直接从请求boday。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>

共有3个答案

孙嘉
2023-03-14

错误参数应遵循已验证的参数:

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

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

邵捷
2023-03-14

我也有类似的问题,如果您使用的是Spring Boot版本(2.3.0)及更高版本,那么valization-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-web启动器中不再包含启动器

许茂才
2023-03-14

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

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

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

删除验证api 2.0.1时,将使用1.1.0版本。但是javax。验证。约束条件。注意:验证api 1.1.0未引入空,因此您将收到另一个错误。

解决这个问题的几种方法

  1. 删除验证api 2.0.1,使用组织。冬眠验证器。约束条件。NotEmpty代替javax。验证。约束条件。注意空
  2. 删除验证api 2.0.1,将spring boot版本升级到2。x、 它将使用hibernate validator 6。x和验证api 2。x、
  3. 保留您的显式验证api 2.0.1声明。然后添加另一个hibernate validator 6.0.14声明。这种情况应该进行全面测试,因为可能存在一些Spring支撑问题
 类似资料:
  • 我最近开始使用,发现它非常有趣。由于我的大多数应用程序都在中,我决定使用团队提供的spring boot starter项目进行快速设置。它附带了autoconf-spring设置,这使得查询endpoint更加容易。 在IDEA中花了几个小时进行项目设置后,我能够运行graphql示例应用程序。但我认为我的servlet仍然没有启用,只有endpoint正在运行,因为默认查询返回。 这是: 这就

  • 我从一个简单的表单提交示例开始 下面是文件 spring-servlet.xml testlink.jsp: 控制器: blank.jsp 我的jsp页面位于 tradelc\src\main\webapp\jsp\testlink.jsp tradelc\src\main\webapp\jsp\blank.jsp 当我给出http://localhost:8181/trade LC/JSP/te

  • 我将应用程序中的Spring boot版本从2.4.4升级到2.5.0,它停止公开 /actuator/infoendpoint。这是pom.xml和application.yml pom。xml 应用yml公司 使用spring boot父版本2.4.4,应用程序能够公开信息endpoint,但不能使用2.5.0。

  • 下面是我的ehcache配置文件 所有Spring注释和配置都正常工作 但是缓存在timetoliveseconds之后无法清除。 谁能帮我一下我的配置有什么问题吗。 下面的页面说它是错误,但不知道如何解决这个问题? 我正在使用sping-boot-starter-cache-2.0.3版本 https://github.com/ehcache/ehcache-jcache/issues/26 有

  • 我有一个使用mvn构建的Spring Boot 2.25应用程序。根据本文件,我添加 从留档: 当DevTools监视类路径资源时,触发重启的唯一方法是更新类路径。导致类路径更新的方式取决于您正在使用的IDE。在Eclipse中,保存修改后的文件将导致类路径更新并触发重启。在IntelliJ IDEA中,构建项目(构建- 随着应用程序的运行,我尝试了一个简单的方法 希望应用程序重新启动,但什么也没

  • 我有一些javascript捆绑文件,非常大,大约1MB。我正在尝试使用yml文件中的以下应用程序属性打开响应压缩: 但不管用。没有压缩发生。 请求标题: ===编辑3===进一步遵循@Chimmi的建议。我已经在建议的地方设置了断点。对静态资源(js文件)的请求似乎从未在这些断点停止过。只有rest API请求才会这样做。对于这些请求,由于某种原因,内容长度为零,这导致跳过内容压缩。 由于@Ch