我有严重的问题(我猜hibernate验证器)。我使用的是Spring boot 2.0,即使是我的春季启动1.4.x也存在问题,对应的版本来自:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
我有简单的域验证 -
ExhibitorListt.class
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="exhibitor_name")
@NotBlank(message="The name of exhibitor cannot be empty!")
private String exhibitorName;
@Column(name="exhibitor_price")
@NotNull(message="Price must be a number")
private Double exhibitorPrice;
@Column(name="catalogue_number")
@NotNull(message="Catalogue number can not be empty!")
private Integer catalogueNumber;
@Column(name="oracle_number")
@NotBlank(message="Oracle number can not be empty")
private String oracleNumber;
简单的Spring MVC控制器
@Secured({ "ROLE_ADMIN" })
@RequestMapping(value = "/new", method = RequestMethod.POST)
public String newExhibitor(Model model, @Valid ExhibitorList newExhibitor, BindingResult result, RedirectAttributes attr) {
if (result.hasErrors()) {
attr.addFlashAttribute("org.springframework.validation.BindingResult.newExhibitor", result);
attr.addFlashAttribute("newExhibitor", newExhibitor);
return "redirect:/exhibitor/new";
}
exhibitorListRepository.save(newExhibitor);
return "redirect:/exhibitor/new";
}
当我尝试创建新实体时,请求需要10到15秒。我附上探查器来诊断问题。它似乎来自hibernate验证。 我无法重现这个错误,因为它不是每次都会发生,而是时不时... 我尝试了很多东西,但没有任何帮助......
来自具有调用树的探查器的JSON。 http://80.241.211.242/sampleCallTree%20(1).json
任何建议都可以。
答案 0 :(得分:0)
正如您在分析中所看到的,所有时间都花在了加载资源的类加载器上。
所以你的问题不是Hibernate Validator,而是Hibernate Validator尝试使用类加载器加载资源包(找到本地化的消息)。
这确实非常奇怪,因为它应该很快,除了I / O问题之外,我没有看到任何理由为什么类加载器可能需要这么长的时间。
您是否可以尝试构建一个最小的Spring Boot复制器?
顺便说一句,@ mark_o是正确的:升级到最新的Hibernate Validator 6.0.7.Final将帮助您,因为在您手动定义消息的特定情况下,我们不再加载资源包。 / p>
话虽如此,如果从类加载器加载单个资源需要大约15秒,我会建议你解决这个问题的根源,因为你暴露了很多问题。