使用Dagger2和Lombok

17

有人使用过带有Dagger2的Lombok 1.16吗?

我的当前代码如下:

@AllArgsConstructor(onConstructor = @__(@Inject))
public class JuiceMaker {
    private final Apple apple;

错误为:

JuiceMaker cannot be provided without an @Inject constructor or from an @Provides-annotated method.

没有 Lombok 的注释,这实际上是有效的,所以:

public class JuiceMaker {
    private final Apple apple;
    @Inject
    public JuiceMaker(Apple apple){
        this.apple = apple
    }
}

工作


我相信你的错误来自其他地方。请查看如何解决无法提供的问题 - David Medenjak
没有使用 Lombok,它可以运行。 - Jessica
如果您正在运行JDK8,则请查看此链接:https://projectlombok.org/api/lombok/RequiredArgsConstructor.html#onConstructor-- - Shankha057
1
@Jessica,你有没有得到这个问题的答案?我也遇到了同样的问题。像你一样,当我手动添加构造函数时,它可以工作,但是当构造函数由Lombok生成并带有@RequiredArgsConstructor(onConstructor = @__(@Inject))时,它就无法工作了。 - Andrew Rose
请查看 https://dev59.com/EFgQ5IYBdhLWcg3wxGtP#50058828 - Markus Schulte
这很可能是一个mvn问题,请查看我的答案这里 - Ore
3个回答

5
这是我在这里的回答的复制粘贴版本:
这不是对已解决问题的直接回答,而是为未来的搜索者提供参考:
如果您正在使用Dagger(或其他东西)处理注释,例如
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.7.0</version>
      <configuration>
        <annotationProcessorPaths>
          <path>
            <groupId>com.google.dagger</groupId>
            <artifactId>dagger-compiler</artifactId>
            <version>2.15</version>
          </path>
        </annotationProcessorPaths>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    ....
  </plugins>
</build>

您需要在此处添加 lombok 的路径,例如:
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.7.0</version>
      <configuration>
        <annotationProcessorPaths>
          <path>
            <groupId>com.google.dagger</groupId>
            <artifactId>dagger-compiler</artifactId>
            <version>2.15</version>
          </path>

          <!-- SOLUTION --> 
          <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
          </path>


        </annotationProcessorPaths>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    ....
  </plugins>
</build>

但是你仍然需要将lombok列为提供的依赖项;)

1
非常感谢!这就是原因! - Dmitry Zlykh
这对我似乎不起作用。如果我从组件接口中删除类,则 lombok 代码会正确生成要绑定到 @Inject 注释的类,但是当我实际尝试使用它时,我会收到 Dagger/MissingBinding 错误。对我来说,如果我使用 IDE delombok @RequiredArgsConstructor(onConstructor_ = @Inject),然后构建它,它也可以正常工作。 - Rik Schaaf
这解决了80%的问题。谢谢。但是,和其他人一样,我仍然无法让@RequiredArgsConstructor(onConstructor = @__(@Inject))起作用。 - Manu Manjunath

2
问题在于,当Dagger注解处理器寻找@Inject构造函数时,它们尚未被Lombok生成。一个解决方案可能是去除源代码的Lombok注解,然后编译它。但我个人没有这样做过。

1
我正在尝试解决这个问题,但不幸的是,我仍然没有成功。
到目前为止,我所做的进展是使用Ant任务作为函数,并将生成的源代码放入某个构建文件夹中,之后dagger处理器可以找到它们。但我承认这种方式可能非常笨拙。
以下代码片段尝试以项目无关的方式使用lombok.jar中的ant任务。
final def generateJava = { ->
  ant.taskdef(
    name: 'delombok',
    classname: 'lombok.delombok.ant.Tasks$Delombok',
    classpath: configurations.annotationProcessor
      .filter { (it.name =~ 'lombok') }.asPath
  )
  ant.mkdir(dir: sourceSets.main.output.classesDirs.asPath)
  ant.delombok(
    verbose: true,
    encoding: StandardCharsets.UTF_8,
    from: sourceSets.main.java.sourceDirectories.asPath,
    to: sourceSets.main.output.classesDirs.asPath,
    modulepath: sourceSets.main.runtimeClasspath.asPath
  )
}

最后,尝试将生成的代码附加到Dagger可以扫描的其他地方。
sourceSets.main.java.srcDirs = sourceSets.main.output.classesDirs

我目前正在使用Gradle版本6.0.1和lombok 1.18.10。我不确定它是否向后兼容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接