Spring Boot JSR

编程入门 行业动态 更新时间:2024-10-26 01:19:06
本文介绍了Spring Boot JSR-303/349配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

在我的 Spring Boot 1.5.1 应用程序中,我正在尝试配置对JSR-303 / JSR-349验证的支持。

In my Spring Boot 1.5.1 application I'm trying to configure support of JSR-303 / JSR-349 validation.

我在我的方法中添加了以下注释 @NotNull @Size(min = 1):

I have added a following annotations @NotNull @Size(min = 1) to my method:

@Service @Transactional public class DecisionDaoImpl extends BaseDao implements DecisionDao { @Override public Decision create(@NotNull @Size(min = 1) String name, String description, String url, String imageUrl, Decision parentDecision, Tenant tenant, User user) { ... } }

我正在尝试从我的测试中调用此方法,但它不会在验证约束。

I'm trying to invoke this method from my test, but it does not fail on the validation constraints.

这是我的测试和配置:

@SpringBootTest(classes = { TestConfig.class, Neo4jTestConfig.class }) @RunWith(SpringRunner.class) @Transactional public class TenantTest { @Test public void testCreateDecision() { User user1 = userService.createUser("test1", "test1", "test1@test", null, null); Tenant tenant1 = tenantDao.create("Tenant 1", "Tenant 1 description", false, user1); // the following line should fail on the validation constraint because name parameter is null but it doesn't final Decision rootDecision = decisionDao.create(null, "Root decision 1 description", null, tenant1, user1); ... @Configuration @ComponentScan("com.example") @SpringBootApplication(exclude={Neo4jDataAutoConfiguration.class}) public class TestConfig { }

我做错了什么以及如何在那里配置JSR-303?

What am I doing wrong and how to configure JSR-303 there ?

更新

我添加了

public Decision create(@Valid @NotNull @Size(min = 1) String name, String description, Decision parentDecision, Tenant tenant, User author) {

但它仍然不起作用

我已将 @Validated 添加到我的 DecisionDaoImpl ,但现在失败并出现以下异常:

I have added @Validated to my DecisionDaoImpl but it fails now with a following exception:

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'decisionDaoImpl': Bean with name 'decisionDaoImpl' has been injected into other beans [criterionGroupDaoImpl,characteristicGroupDaoImpl,tenantDaoImpl] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:585) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ... 43 common frames omitted

我有还在我自动装载我的 DecisionDao 的地方添加了 @Lazy 注释,但是现在我的测试失败了以下异常:

I have also added @Lazy annotation in a places where I'm autowiring my DecisionDao but right now my test fails with a following exception:

javax.validation.ConstraintDeclarationException: HV000151: A method overriding another method must not alter the parameter constraint configuration, but method public com.example.domain.model.entity.decision.Decision com.example.domain.dao.decision.DecisionDaoImpl.create(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Long,java.lang.Long,com.example.domain.model.entity.user.User) changes the configuration of public abstract com.example.domain.model.entity.decision.Decision com.example.domain.dao.decision.DecisionDao.create(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Long,java.lang.Long,com.example.domain.model.entity.user.User). at org.hibernate.validator.internal.metadata.aggregated.rule.OverridingMethodMustNotAlterParameterConstraints.apply(OverridingMethodMustNotAlterParameterConstraints.java:24) at org.hibernate.validator.internal.metadata.aggregated.ExecutableMetaData$Builder.assertCorrectnessOfConfiguration(ExecutableMetaData.java:456)

推荐答案

移动验证接口,如下:

import javax.validation.Valid; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; public interface DecisionDao { Decision create(@Valid @NotNull @Size(min = 1) String name, String description, String url, String imageUrl); }

注释 DecisionDaoImpl 使用 @Validated ,如下所示:

Annotate your DecisionDaoImpl with @Validated, as follows:

import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @Service @Validated public class DecisionDaoImpl extends BaseDao implements DecisionDao { @Override public Decision create(String name, String description, String url, String imageUrl) { System.out.println(name); return new Decision(); } }

修改测试用例以验证是否 javax.validation.ConstraintViolationException 使用断言或 ExpectedException ,如下:

Modify your test case to verify for javax.validation.ConstraintViolationException using assertj or ExpectedException, as follows:

import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import javax.validation.ConstraintViolationException; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; @ContextConfiguration(classes = { TenantTest.Config.class }) @RunWith(SpringRunner.class) public class TenantTest { @Autowired private DecisionDao decisionDao; @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void testCreateDecisionUsingAssertj() { assertThatExceptionOfType(ConstraintViolationException.class) .isThrownBy( () -> decisionDao.create(null, "Root decision 1 description", null, null)); } @Test public void testCreateDecision() { expectedException.expect(ConstraintViolationException.class); decisionDao.create(null, "Root decision 1 description", null, null); } @Configuration public static class Config { @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(); } @Bean public DecisionDao decisionDao() { return new DecisionDaoImpl(); } } }

确保你有 hibernate-validator 以及@StanislavL答案:

Make sure you have hibernate-validator in your classpath along with @StanislavL answer:

<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency>

org.assertj.core.api的可选依赖项.Assertions.assertThatExceptionOfType ,as:

And an optional dependency for org.assertj.core.api.Assertions.assertThatExceptionOfType, as:

<dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.3.0</version> <scope>test</scope> </dependency>

有关示例,您可以参考 arpitaggarwal / jsr-303

For sample example, you can refer arpitaggarwal/jsr-303

更多推荐

Spring Boot JSR

本文发布于:2023-10-07 17:26:48,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1470020.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Spring   Boot   JSR

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!