Я использую Spring Boot 1.3.5 с Rest Controllers, и все работает нормально.
Я также использую примеры методов проверки Spring из официальной документации (JSR-303 Bean Validation API и интерфейс проверки Spring, я попробовал оба и столкнулся с одной и той же проблемой), и проверки работают, но я не могу настроить пользовательские сообщения.
Я настроил файл messages.properties, и я могу получить доступ к сообщениям в этом файле без проблем. Однако эта проверка, похоже, не может читать или получать доступ к моему источнику сообщений (messages.properties), настроенному автоматически через весеннюю загрузку.
Я могу получить доступ к сообщениям непосредственно из объекта источника сообщений, введенного в контроллер через @Autowired (в коде есть комментарий). Однако результат привязки интерфейса валидатора Spring или проверки бина JSR-303, по-видимому, не может получить доступ к messages.properties, загруженным в MessageSource. В результате у моих ошибок есть коды, но нет сообщений по умолчанию.
Вот мой класс приложения:
@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;
}
}
Вот мой Бин:
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());
}
}
Итак, этот код работает нормально, и метод не вызывается, так как я вызываю метод с недопустимым протоколом. Однако мой клиент angularJS получает ответ с заполненными кодами ошибок, но со всеми пустыми сообщениями по умолчанию, поскольку проверка не видит мои загруженные messages.properties.
Есть ли способ заставить мои интерфейсы проверки Spring или проверку JSR-303 включать загруженные свойства message.properties (источник сообщений) в весеннюю загрузку? Как я могу это исправить? Если необходимо, я также могу вставить свой пример кода интерфейсов 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());
}
}