当前位置: 首页 > 知识库问答 >
问题:

Spring启动验证CGLIB增强型控制器组件不是autowired

益光亮
2023-03-14
    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-validation</artifactId> 
    </dependency> 

并在我的controller类上添加了@validated,以便对其中的所有方法进行验证:

@RestController
@Validated 
public class UserController {
  @Autowired
  private UserService userService;

  @PostConstruct
  public void init() {
    System.out.println("test");
  }
}

现在,控制器方法在调用时开始抛出NullPointerExceptions,因为userService为Null;我做了一个@PostConstruct作为测试。显然,它是在一个正常的未增强的豆子上调用的,它已经正确地获得了田地。但是当通过HTTP调用控制器时,这个未增强的bean不会被调用,而是一个userController$$EnhancerBySpringCGlib$$类的bean,并且它没有autowired的userController。我真的不知道为什么,因为这应该是非常简单的,没有太多的配置,据我所知。因此,我想由于某种原因,spring没有将依赖项注入到CGLIB增强类中,或者只是将其注入到错误的类中。当我删除@validated时,一切都恢复正常,但当然没有验证。

共有1个答案

呼延才
2023-03-14

使用提供的代码并创建一个虚拟的UserService类,HTTP请求可以在其他环境中正常工作。

为了帮助解决这个问题,您应该创建一个新项目,添加Lombokstarter-webstarter-validation依赖项。创建以下类。

@RestController
@Validated
public class UserController {
    @Autowired
    private UserService userService;

    @PostConstruct
    public void init() {
        System.out.println("test");
    }

    @GetMapping("/test")
    public int test(){
        return userService.getAge();
    }
}
@Data
@Service
public class UserService {
    private int age = 21;
}

然后测试http://localhost:8080/test

 类似资料:
  • 特性状态: Alpha Kubernetes 内置 StatefulSet 为 Pods 分配连续的序号。比如 3 个副本时,Pods 分别为 pod-0, pod-1, pod-2。扩缩容时,必须在尾部增加或删除 Pods。比如扩容到 4 个副本时,会新增 pod-3。缩容到 2 副本时,会删除 pod-2。 在使用本地存储时,Pods 与 Nodes 存储资源绑定,无法自由调度。若希望删除掉中

  • 我想验证请求参数。我已经浏览了很多博客并回答了问题,我也做了同样的事情。在控制器类上添加了@Validated。 控制器中的方法: 控制器建议 配置: 完成所有这些之后,现在我得到一个404错误。"状态":404,"错误":"未找到","消息":"没有可用的消息"

  • 我有一个spring rest服务,它接受Person对象。Person对象具有名称、电话号码和电子邮件。当添加一个人时,电话号码是强制性的。如果存在电话号码属性,它将使用或或验证是否为空。但是如果属性不存在,验证就不起作用。请建议提供任何验证注释,以检查JSON请求中是否存在该属性。 以下是请求体测试用例 {“name”:“anu”,“phonenumber”:“”,“email”:“test@

  • 我知道有一个有效的注释,它指示spring根据JSR-303验证一个控制器参数,在这个示例中: 但我希望能够以某种方式配置Spring,以便在所有控制器中启用验证,而无需明确指定有效的注释。 这有可能吗?一些Spring配置?利用AOP?。。。

  • 我有混合堆栈:EJB和Spring。为了将Spring自动连接到EJB,我使用(不确定这是否会影响我遇到的问题)。 Whlie试图通过以下方式自动连接bean: 我得到错误: 据我所知,问题是使用了JDK代理(因为实现了接口),而我需要cglib代理。 不确定是否相关,但我运行的是glassfish 3.1.x。 和stacktrace(部分,因为我不能在这里公开所有类名:

  • 嗨,我用spring初始化器创建了一个简单的Spring Boot应用程序。我在主应用程序类的同一文件夹中添加了一个控制器。 这是给我以下错误的网址http://localhost:8080/welcome 此应用程序没有针对/错误的显式映射,因此您将其视为回退。 Sat Dec 19 12:51:44 IST 2020出现意外错误(类型=未找到,状态=404)。 如果我使用@restContro