【发布时间】:2017-01-23 22:04:34
【问题描述】:
我正在使用带有 Rest Controller 的 Spring Boot 1.3.5,一切正常。
我还使用官方文档中的 Spring 验证示例技术(JSR-303 Bean Validation API 和 Spring 的验证器接口,我尝试了这两种方法并遇到了同样的问题)并且验证工作正常,但我无法配置自定义消息。
我已经配置了一个messages.properties 文件,我可以很好地访问这个文件中的消息。但是,此验证似乎无法读取或访问我通过 spring boot 自动配置的消息源(messages.properties)。
我可以直接从通过@Autowired 注入控制器的消息源对象访问消息(代码中有注释)。但是,Spring 的验证器接口或 JSR-303 Bean Validation 的绑定结果似乎无法访问加载在 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;
}
}
这是我的 Bean:
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;
}
}
这是我的休息控制器:
@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());
}
}
所以,这段代码工作正常,并且没有调用该方法,因为我使用无效的 Protocolo 调用该方法。但是,我的 angularJS 客户端收到了填充了错误代码的响应,但所有默认消息都为空,因为验证没有看到我加载的 messages.properties。
有没有办法让我的 Spring 验证接口或 JSR-303 验证在 spring boot 中合并加载的 message.properties (messagesource)?我该如何纠正这个?如果有必要,我也可以粘贴我的 Spring Validation 接口代码示例。
非常感谢,
塔西西奥。
测试代码:
@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());
}
}
【问题讨论】:
标签: java spring spring-boot bean-validation spring-validator