【发布时间】:2021-02-17 14:38:08
【问题描述】:
以下代码在 isValid() 函数内的 teamResource 自动连接对象上产生 null:
@Component //I am not sure it is required he
public class TeamIdValidator implements ConstraintValidator<TeamIdConstraint, Integer> {
@Autowired private TeamResource teamResource;
public TeamIdValidator() {
}
@Override
public void initialize(TeamIdConstraint teamIdConstraint) {
// this.teamIdConstraint = teamIdConstraint;
}
@Override
public boolean isValid(Integer teamId, ConstraintValidatorContext cxt) {
int numOfAvailableTeams = teamResource.retrieveAllTeams().size(); //teamResource is null :(
return teamId < 0 || teamId >= numOfAvailableTeams;
}
}
团队资源类:
@RestController
@CrossOrigin
public class TeamResource {
@Autowired private TeamRepository teamRepository;
public TeamResource() {
}
...
//mapping methods
}
如果相关的话……
@Documented
@Constraint(validatedBy = TeamIdValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface TeamIdConstraint {
String message() default "Invalid team id!";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
为什么teamResource 为空?
它没有在其他任何地方用 new 显式初始化。
【问题讨论】:
-
我会检查你的链接。谢谢:)
-
我怀疑实例是由 Spring 以外的东西创建的 - 验证器框架。为什么不在 TeamIdValidator 空构造函数中设置断点并检查堆栈跟踪 - 大概它被 Spring 初始化一次,然后又被其他东西初始化。调用 isValid 时检查对象 ID - 我敢打赌它是非 Spring bean 实例。
-
@pirho 你的链接是完全相关的——几周前我一直在努力解决这个问题。默认方式是休眠方式。
-
@ggr 你能详细说明一下方法吗?有具体的链接吗?
标签: spring spring-boot hibernate spring-data-jpa