问题描述
为什么要进行Hibernate验证- ConstraintViolationException-不会在带有spring-boot-starter-web的SpringBoot应用程序(SpringBoot的最新版本)的main()中抛出:
@Validated
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
someService.doStuff(new Item(null); // WHY NOT THROWN????????!!!!!!
// Expecting ConstraintViolationException: doStuff.item.content: must not be null
}}
// ----------------------
public class Item {
@NotNull
String content; // to be validated
//constructor,getter,setter
}
@Validated
@Service
public class SomeService {
void doStuff(@Valid Item item) {} // should break for Item's content = null
}
奇怪的是,在其他情况下,对于相同的方法调用,Hibernate验证可以按预期运行:
-
当我将无效的调用放入控制器的构造器时,会抛出
- ConstraintViolationException:
public SomeController(SomeService someService){
this.someService = someService;
someService.doStuff(new Item(null); // throws ConstraintViolationException
}
- 也正如预期的那样,当我将无效呼叫
in a constructor method
放入测试或Postman中呼叫端点时,会引发ConstraintViolationException
@GetMapping("item")
public String item() {
someService.doStuff(new Item(null); // throws ConstraintViolationException
return "You never get here.";
}
解决方法
不确定如何在from operator import itemgetter
loss = list(map(itemgetter("loss"),z))
val_loss = list(map(itemgetter("val_loss"),z))
accuracy = list(map(itemgetter("accuracy"),z))
val_accuracy = list(map(itemgetter("val_accuracy"),z))
中获得someService
实例,但是以下代码对我有用(每个类在不同文件中):
Application
结果:
使用:
@AllArgsConstructor
@Getter
@Setter
public class Item {
@NotNull
String content;
}
@Validated
@Service
public class SomeService {
public void doStuff(@Valid Item item) {
System.out.println(format("Item.content = %s",item.getContent()));
}
}
@SpringBootApplication
public class TestingPurposeApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(TestingPurposeApplication.class,args);
SomeService someService = context.getBean(SomeService.class);
someService.doStuff(new Item(null));
}
}
是通过ConfigurableApplicationContext context = SpringApplication.run(MyApplication.class,args);
MyClass myInstance = context.getBean(MyClass.class);
方法获取由Spring管理的组件的合适方法。