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

Spring数据Rest验证器

吴俊风
2023-03-14

我一直试图将Spring验证器添加到Spring数据Rest项目中。

我跟着并通过这个链接设置了“入门”应用程序:http://spring.io/guides/gs/accessing-data-rest/

...现在,我正试图通过以下文档添加自定义PeopleValidator:http://docs.spring.io/spring-data/rest/docs/2.1.0.RELEASE/reference/html/validation-chapter.html

我定制的PeopleValidator看起来像

package hello;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

public class PeopleValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    public void validate(Object target, Errors errors) {
        errors.reject("DIE");
    }
}

...还有我的申请。java类现在看起来像这样

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;

@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public PeopleValidator beforeCreatePeopleValidator() {
        return new PeopleValidator();
    }
}

我希望在http://localhost:8080/peopleURL将导致某种错误,因为PeopleValidator拒绝所有内容。但是,不会抛出错误,也不会调用验证程序。

我还尝试手动设置验证器,如SpringDataREST文档的第5.1节所示。

我错过了什么?

共有3个答案

燕砚文
2023-03-14

有点见不得人——我没有使用sping-data-rest。然而,在阅读了下面的教程后,我认为问题是您需要一个个性验证器而不是一个PeopleValidator。相应地重新命名所有内容:

个人验证

package hello;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

public class PersonValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    public void validate(Object target, Errors errors) {
        errors.reject("DIE");
    }
}

应用程序

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;

@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public PersonValidator beforeCreatePersonValidator() {
        return new PersonValidator();
    }
}
花永昌
2023-03-14

看起来该功能目前尚未实现(2.3.0),不幸的是事件名称没有常量,否则下面的解决方案就不会那么脆弱了。

配置使用正确的事件将所有正确命名的验证程序bean添加到验证RepositoryEventListener

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.rest.core.event.ValidatingRepositoryEventListener;
import org.springframework.validation.Validator;

@Configuration
public class ValidatorRegistrar implements InitializingBean {

    private static final List<String> EVENTS;
    static {
        List<String> events = new ArrayList<String>();
        events.add("beforeCreate");
        events.add("afterCreate");
        events.add("beforeSave");
        events.add("afterSave");
        events.add("beforeLinkSave");
        events.add("afterLinkSave");
        events.add("beforeDelete");
        events.add("afterDelete");
        EVENTS = Collections.unmodifiableList(events);
    }

    @Autowired
    ListableBeanFactory beanFactory;

    @Autowired
    ValidatingRepositoryEventListener validatingRepositoryEventListener;

    @Override
    public void afterPropertiesSet() throws Exception {
        Map<String, Validator> validators = beanFactory.getBeansOfType(Validator.class);
        for (Map.Entry<String, Validator> entry : validators.entrySet()) {
            EVENTS.stream().filter(p -> entry.getKey().startsWith(p)).findFirst()
                    .ifPresent(p -> validatingRepositoryEventListener.addValidator(p, entry.getValue()));
        }
    }
}
章承基
2023-03-14

因此,似乎之前/之后的“保存”事件只在PUT和补丁上触发。发布时,在"创建"事件之前/之后触发。

我再次尝试使用configureValidatingRepositoryEventListener重写手动方式,并且成功了。我不知道我在工作和在家有什么不同。我明天得看看。

我当然很想听听其他人是否有关于为什么它不起作用的建议。

为了记录在案,下面是新应用程序的内容。java类看起来像。

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.rest.core.event.ValidatingRepositoryEventListener;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;

@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application extends RepositoryRestMvcConfiguration {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
        validatingListener.addValidator("beforeCreate", new PeopleValidator());
    }
}
 类似资料:
  • ... 而这个RestResource dao 向API/公司发送请求: 我尝试创建以下bean,但它似乎从来没有做任何事情: 即使它确实有效,它将如何帮助我使用正确的http代码和可理解的json响应开发更好的错误响应? 如此困惑 使用1.3.2.发布

  • 我正在spring boot rest中对请求对象进行验证。我必须验证请求的数据类型。该请求有多个布尔值,并试图验证是否为布尔数据类型传入了字符串。我在ControllerAdvice类中处理了HttpMessageOnTreadableException,并发送了错误消息列表。但在我的回答中,只有第一个字段抛出异常。如果有线索,请帮忙。

  • 我想验证请求参数。我已经浏览了很多博客并回答了问题,我也做了同样的事情。在控制器类上添加了@Validated。 控制器中的方法: 控制器建议 配置: 完成所有这些之后,现在我得到一个404错误。"状态":404,"错误":"未找到","消息":"没有可用的消息"

  • 这种类型的验证有效吗? 更新: StackTrace的一部分: 属性可以解决这个问题。但它仍然不是。

  • 我尝试使用@ControllerAdvise+@ExceptionHandler来捕获ConstraintViolationException,但是它似乎是以前捕获的,抛出的是TransactionSystemException。 验证数据是非常基本的事情,但出于某种原因,在搜索了很多次之后,我还没有找到解决方案。 编辑:显示代码:

  • 我有一个使用SpringDataREST的非常简单的SpringBoot2.0.3项目。 当我尝试使用http:localhost:8080/users上的POST添加电子邮件地址无效的用户时,会返回以下JSON: 波姆。XML 用户应用。JAVA 使用者JAVA 用户存储库。JAVA 我在谷歌上搜索过,几年前似乎有很多相关的问题,我在这里尝试过建议的解决方案 但这些都不起作用。 我已经花了很多时