1 java spring bean-validation spring-validator spring-boot
我正在将Spring Boot 1.3.5与Rest Controllers一起使用,并且一切正常。
我还在官方文档中使用了Spring的验证示例技术(JSR-303 Bean验证API和Spring的验证器接口,我都尝试过并且遇到相同的问题),并且验证有效,但是我无法配置自定义消息。
我已经配置了messages.properties文件,并且可以很好地访问此文件上的消息。但是,此验证似乎无法读取或访问通过Spring Boot自动配置的我的消息源(messages.properties)。
我可以直接通过@Autowired从控制器中注入的消息源对象访问消息(代码中有注释)。但是,Spring的验证器接口或JSR-303 Bean验证的绑定结果似乎无法访问MessageSource中加载的messages.properties。我得到的结果是我的错误有代码,但没有默认消息。
这是我的应用程序类:
@SpringBootApplication
@ImportResource({ "classpath:security/cas-context.xml", "classpath:security/cas-integration.xml",
"classpath:security/security.xml" })
@EnableAutoConfiguration(exclude = VelocityAutoConfiguration.class) // http://stackoverflow.com/questions/32067759/spring-boot-starter-cache-velocity-is-missing
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public ServletRegistrationBean cxfServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/services/*");
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
@Bean
public Nfse nfseService() {
return new NfseImpl();
}
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), nfseService());
endpoint.publish("/nfseSOAP");
return endpoint;
}
Run Code Online (Sandbox Code Playgroud)
}
这是我的豆子:
public class Protocolo {
private Long id;
@NotNull
@Min(1)
@Max(1)
private String protocolo;
private StatusProtocoloEnum status;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getProtocolo() {
return protocolo;
}
public void setProtocolo(String protocolo) {
this.protocolo = protocolo;
}
public StatusProtocoloEnum getStatus() {
return status;
}
public void setStatus(StatusProtocoloEnum status) {
this.status = status;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的休息控制器:
@RestController
public class ProtocoloController {
@Autowired
private MessageSource messageSource;
@Autowired
private ProtocoloDAO protocoloDAO;
@RequestMapping(value = "/prot", method = RequestMethod.POST)
public void testar(@Valid @RequestBody Protocolo p) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
System.out.println(auth.getAuthorities());
System.out.println(messageSource.getMessage("protocolo.tamanho", null, null));
// IN THIS PART I'M ABLE TO PRINT THE MESSAGE IF VALIDATION IS DISABLED
System.out.println(p.getProtocolo());
}
Run Code Online (Sandbox Code Playgroud)
}
因此,此代码可以正常工作,并且由于我使用无效的Protocolo调用该方法而未调用该方法。但是,我的angularJS客户端收到的响应中填充了错误代码,但所有默认消息为空,因为验证没有看到我加载的messages.properties。
有没有一种方法可以使我的Spring验证接口或JSR-303验证在Spring Boot中合并已加载的message.properties(messagesource)?我该如何纠正?如果有必要,我也可以粘贴Spring Validation接口的代码示例。
非常感谢,
塔西奥(Tarcísio)。
测试代码:
@RestController
public class ProtocoloController {
@Autowired
private MessageSource messageSource;
@Autowired
private ProtocoloDAO protocoloDAO;
@RequestMapping(value = "/prot", method = RequestMethod.POST)
public void testar(@Valid @RequestBody Protocolo p, BindingResult bindingResult) {
System.out.println(messageSource.getMessage("Min.protocolo.protocolo", null, null));
if (bindingResult.hasErrors()) {
System.out.println(bindingResult.getFieldError().getDefaultMessage());
System.out.println(bindingResult.getFieldError().getCode());
}
System.out.println(p.getProtocolo());
}
Run Code Online (Sandbox Code Playgroud)
}
编辑:Spring Boot 1.5.3中的已知错误请参阅https://github.com/spring-projects/spring-boot/issues/8979
在春季启动以来1.5.3你需要这样做
@Configuration
public class ValidationMessageConfig {
@Bean
public LocalValidatorFactoryBean mvcValidator(MessageSource messageSource) {
LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean();
factory.setValidationMessageSource(messageSource);
return factory;
}
}
Run Code Online (Sandbox Code Playgroud)
然后它将起作用。
使用1.5.2版及之前的版本进行扩展WebMVcConfigurerAdapter
@Configuration
public class ProfileMvcConfig extends WebMvcConfigurerAdapter {
private MessageSource messageSource;
@Autowired
public ProfileMvcConfig(MessageSource messageSource) {
this.messageSource = messageSource;
}
/**
* This method is overridden due to use the {@link MessageSource message source} in bean validation.
*
* @return A Validator using the {@link MessageSource message source} in bean validation.
*/
@Override
public Validator getValidator() {
LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean();
factory.setValidationMessageSource(messageSource);
return factory;
}
}
Run Code Online (Sandbox Code Playgroud)
另请参阅文档
| 归档时间: |
|
| 查看次数: |
9722 次 |
| 最近记录: |