Spring Boot JSR-303/349 configuration

前端 未结 3 1294
北海茫月
北海茫月 2021-02-06 06:22

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

I have added a following annotations @NotNull @S

3条回答
  •  萌比男神i
    2021-02-06 07:03

    Move your validation to interface, as follows:

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

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

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

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

    
        org.hibernate
        hibernate-validator
    
    

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

    
         org.assertj
         assertj-core
         3.3.0
         test
    
    

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

提交回复
热议问题