添加@Validated spring注释后未实例化控制器实现接口

时间:2018-12-07 23:45:38

标签: spring spring-mvc spring-boot spring-validator

我在RestController下方有一个试图在其中验证search()方法输入参数映射为空的地方。但是,在单元测试期间,当实现ServiceIF接口时,不会实例化此RestController。如果我评论实现接口,则将实例化控制器,并且验证工作正常。我不明白为什么为实现某些接口的类注释@Validated无效。

@Validated
@RestController
public class MyServiceImpl implements ServiceIF{

    @RequestMapping(value = "search", method = RequestMethod.POST, produces = APPLICATION_JSON)
    public ResponseEntity<Object> search(@RequestBody @NotEmpty Map<String, String> body) {
    }
}

我正在编写下面的单元测试,以验证是否有空的地图:

RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { Application.class})
public class MyServiceImplTest {

    @Autowired
    private ServiceIF controller;
    private MockMvc mockMvc;

    @Before
    public void setUp(){
            mockMvc = MockMvcBuilders.standaloneSetup(controller)
                                    .setControllerAdvice(new InputValidationsExceptionHandler())
                                    .build();
    }

    @After
    public void tearDown(){
            mockMvc = null;
    }

    @Test
    public void testSearchInvalid() throws Exception{
        ObjectMapper mapper = new ObjectMapper();
        Map<String, String> map = new HashMap<>();
        String data = mapper.writeValueAsString(map);

        //Test invalid case
        this.mockMvc.perform(post("/search").content(data)
                                .contentType(MediaType.APPLICATION_JSON))
                                .andDo(print())
                                .andExpect(status().isBadRequest());

    }
} 

1 个答案:

答案 0 :(得分:0)

问题可能出在ServiceIF界面中。如果ServiceIF.search方法参数没有注释@NotEmpty。您将在应用程序启动时得到异常:

  

javax.validation.ConstraintDeclarationException:HV000151:覆盖另一个方法的方法一定不能重新定义参数   约束配置

请参阅this spec