Spring -泛型超类未正确示例化?

xwmevbvl  于 2022-12-10  发布在  Spring
关注(0)|答案(1)|浏览(129)

ATM我正在重构我们的Selenium E2 E测试框架以使用Spring。
我的类/豆:

package info.fingo.selenium.utils.driver;

@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class ProxyDecorator extends WebDriverDecorator<WebDriver> {

@Autowired
public ProxyDecorator(TestUtils testUtils, DriverManager driverManager) {
    super(WebDriver.class);
    this.testUtils = testUtils;
    this.driverManager = driverManager;

超类别:

package org.openqa.selenium.support.decorators;

public class WebDriverDecorator<T extends WebDriver> {

  private final Class<T> targetWebDriverClass;

  private Decorated<T> decorated;

  @SuppressWarnings("unchecked")
  public WebDriverDecorator() {
    this((Class<T>) WebDriver.class);
  }

  public WebDriverDecorator(Class<T> targetClass) {
    this.targetWebDriverClass = targetClass;
  }

  public final T decorate(T original) {
    Require.nonNull("WebDriver", original);

    decorated = createDecorated(original);
    return createProxy(decorated, targetWebDriverClass);
  }

调用此线路时出现问题:

createProxy(decorated, targetWebDriverClass)

其中targetWebDriverClass因为未知原因是null,并且稍后抛出了NullPointerException。这不应该发生,因为targetWebDriverClass总是通过构造函数设置的--要么由客户端提供(调用super(class)),要么默认为默认WebDriverDecorator构造函数中的WebDriver.class。没有Spring也能正常工作,不幸的是我对Spring的了解不够,无法通过调试获得任何信息。
我的Spring依赖项:

ext.springVersion = '2.7.1'

dependencies {
    //SPRING BOOT
    api "org.springframework.boot:spring-boot-starter:$springVersion",
            "org.springframework.boot:spring-boot-starter-aop:$springVersion",
            "org.springframework.boot:spring-boot-starter-test:$springVersion",
yjghlzjz

yjghlzjz1#

超类WebDriverDecorator中的decorate方法被标记为final,这使得它不适合Spring CGLIB代理,因为它不能代理final方法(& classes)-抱歉,我不知道导致我的问题的确切原因。这不是我自己的类,它是从依赖项内部获取的,所以我不能更改它。
这意味着这个类不能被Spring管理。为了让这个类工作,我去掉了继承(extends关键字),用composition代替它。需要做一些反射魔法(对于它的一个protected方法),但这似乎可以做到。

相关问题