休眠方法验证并非始终有效

问题描述

为什么要进行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验证可以按预期运行

    当我将无效的调用放入控制器的构造器时,会抛出
  1. ConstraintViolationException:
public SomeController(SomeService someService){
    this.someService = someService;
    someService.doStuff(new Item(null); // throws ConstraintViolationException  
}
  1. 也正如预期的那样,当我将无效呼叫 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

结果:

ConstraintViolationException

使用:

@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管理的组件的合适方法。