标签: immutables-library

如何使GitHub的Immutables在IntelliJ + Gradle中工作

我使用GitHub的Immutables库进行Android开发,现在我想在后端方面尝试一下.

在Android中,为了使用该库,我需要的是:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // immutable entities generation
    provided "org.immutables:value:2.5.5" // for annotations
    provided "org.immutables:builder:2.5.5" // for annotations
    provided "org.immutables:gson:2.5.5" // for annotations

    ... other dependencies
}
Run Code Online (Sandbox Code Playgroud)

当我尝试将上述依赖项复制到build.gradle我的Java项目中时,我收到此错误:

Error:(24, 0) Gradle DSL method not found: 'provided()'
Run Code Online (Sandbox Code Playgroud)

我试图providedcompileOnly和替换compile,但是然后@Value.Immutable没有生成带注释的接口的实现.

我如何使其工作?

java intellij-idea gradle build.gradle immutables-library

10
推荐指数
2
解决办法
3106
查看次数

Immutables不会使用带有模块的java 9生成代码

使用immutables-library可以正常使用java 9,直到我添加一个module-info.java项目,Immutables*.java将不再生成.

对于模块信息,我按照IntelliJ的建议添加"需要值".

我缺少什么,是一个immutables-library问题或我需要设置的其他东西,以便javac找到注释处理.

我正在使用maven-compiler-plugin:3.7.0配置为target/source = 9的 maven .

java maven java-platform-module-system java-9 immutables-library

7
推荐指数
1
解决办法
1530
查看次数

我可以指定要添加到Immutable生成的类的注释吗?

我有一些使用Immutables(https://immutables.github.io/)的代码,它使用如下ImmutableEntity方法生成一个类:

public static ImmutableEntity of(EntityId id,
                                  Locale language,
                                  String text)) {
  return validate(new EntityMeldung(id, language, text));
}
Run Code Online (Sandbox Code Playgroud)

但要使用MongoDB POJO,我需要使用该方法来注释:

@BsonCreator
public static ImmutableEntity of(@BsonProperty("id") EntityId id,
                                  @BsonProperty("language") Locale language,
                                  @BsonProperty("text") String text)) {
  return validate(new ImmutableEntity(id, language, text));
}
Run Code Online (Sandbox Code Playgroud)

Entity接口只定义了一些getter和我宁愿继续让Immutables生成的ImmutableEntity类和方法,如of()

我应该看注释注射吗?

java immutables-library

5
推荐指数
0
解决办法
230
查看次数

Spring Boot的不变配置

我正在尝试找到一种使用Immutables库创建用于保存Spring Boot应用程序配置的数据类的方法。

我的数据配置类是:

@Value.Immutable
@JsonDeserialize(as = ImmutableAuthConfig.class)
public interface AuthConfig {
    String domain();
    String clientId();

    @Value.Redacted
    String clientSecret();
}
Run Code Online (Sandbox Code Playgroud)

当主配置类设置为

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
public class Config {
    private ImmutableAuthConfig auth;

    public AuthConfig getAuth() {
        return auth;
    }

    public void setAuth(ImmutableAuthConfig auth) {
        this.auth = auth;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用“ ImmutableAuthConfig或”或“仅” AuthConfig作为字段的一些变体,但没有任何方法可以改善这种情况。尚未获取配置,并且在应用程序启动后auth仍保留配置字段null

AuthConfig用传统的POJO 替换类的内容可以解决此问题,但是我更喜欢一个不变的对象。有什么方法可以说服Spring与Immutables库生成的类进行接口连接?

java spring-boot immutables-library

5
推荐指数
1
解决办法
665
查看次数

使用 Immutables 时关闭 MapStruct 中的“构建器”

如何在 MapStruct 中完全禁用“构建器”?我根本不想使用它们,因为它们给我带来了各种各样的问题。

我在 META-INF 下创建了服务文件(我更喜欢一种将它分配给映射构建器 = 的方法,但我没有看到任何如何在代码中正确执行此操作的示例)。

它仍在尝试使用我想要映射到的“ModifiableXXX”实例的 Immutables“builder”实例实例。如果可用,我什至会采取一种方法将其强制为可修改类型。

在另一个映射中,使用更新 ModifiableXXX(使用 @AfterMapping 和 @MappingTarget)方法有效。

我的映射器现在看起来像这样:

@Mapper
public interface MongoProjectMapper
{
    ModifiableProject mapModel(MongoProject project);

    @AfterMapping
    ModifiableProject updateProject(MongoEntity e, @MappingTarget ModifiableProject p);
}
Run Code Online (Sandbox Code Playgroud)

mapstruct immutables-library

5
推荐指数
2
解决办法
4694
查看次数

无法在 vs 代码中加载注释处理器工厂

我正在尝试将该immutables库与 vscode(和 Gradle)一起使用。

我采取的步骤:

  1. 确认jar存在
  2. 确保GRADLE_USER_HOME变量存在(最初没有)
  3. 设置“java.import.gradle.home”vscode 设置(GRADLE_HOME)
  4. 确保项目构建使用 gradle build

我一直挂在环境变量上。GRADLE_USER_HOMEGRADLE_HOME.

我在 MacOS 上,我没有使用 安装 vscode brew,但实际上是从 vscode 网站下载了该应用程序。

Unable to load annotation processor factory 'GRADLE_USER_HOME/caches/modules-2/files-2.1/org.immutables/value/2.7.3/91d271437be1e14438a2da6c5c3e9f8db061a7b9/value-2.7.3.jar' for project

java visual-studio-code immutables-library vscode-settings

5
推荐指数
1
解决办法
946
查看次数

我应该在使用Immutables的单元测试中使用真实对象或模拟吗?

如果我必须测试使用可变实体的服务,我将构建我需要的最小对象(真实的)并将其传递给我的服务.例:

User joe = new User();
joe.setEmail("joe@example.com");

resetPasswordService.resetPassword(joe);

verif(emailServiceMock).sendEmail("joe@example.com", "Your password has been reset!");
Run Code Online (Sandbox Code Playgroud)

显然用户有很多字段,但我不设置它们,因为resetPasswordService不需要它们.这是非常重构的,因为如果我重命名不是电子邮件的用户字段,则不会更改此测试.

当我尝试使用Immutables对象执行相同操作时,会出现问题.我将坚持使用相同的示例并将用户从实体转变为不可变的.

@Value.Immutable
public abstract class User {
    public abstract String getEmail();
    public abstract PostalAddress getPostalAddress();
    //more fields
}

User joe = new ImmutableUserBuilder().email("joe@example.com").build();

resetPasswordService.resetPassword(joe);

verif(emailServiceMock).sendEmail("joe@example.com", "Your password has been reset!");
Run Code Online (Sandbox Code Playgroud)

java.lang.IllegalStateException:无法构建User,未设置某些必需属性[postalAddress,signupDate,city,....]

在构建器尝试构建对象时,它在构建器中失败.所以我该怎么做?

  • 使用模拟用户并让它返回模拟,即使每次模拟返回模拟仙女死亡
  • 创建一个测试DSL并拥有某种工厂来构建整个用户树结构,其中包含我不需要的所有字段?似乎很重,而不是那么重构友好.这使得测试的要求不那么透明.
  • 在User中创建所有字段@Nullable并让构建器不验证对象?这会让我面临生产中不完整物品的风险,对吧?
  • 我错过了一些其他选择?

我知道用户应该是实体而不是不可变的值对象.我在这个例子中使用了User,因为它很容易理解.

java unit-testing object mockito immutables-library

4
推荐指数
1
解决办法
1139
查看次数

为什么不鼓励使用immutable null?

我目前正在使用Immutable库从我的Web应用程序生成JSON对象.

看一下这一章,第一行说:

不鼓励使用可空属性.

所以我的问题是:

1)为什么?null对象有什么问题?

2)如果我使用的是第三个对象的包装器并且我不知道item是否为null,那么使用分类构建器代码将失败:

MyImmutableWrapperObject
    .builder().
    .mobile(input.getMobile()) // don't know if null or not
    .build();
Run Code Online (Sandbox Code Playgroud)

有没有最佳解决方案?

编辑:

@JsonProperty("mobile")
public abstract Optional<String> mobile();  

...

// composing builder
if (input.getMobile() != null)
        builder.mobile(input.getMobile());
Run Code Online (Sandbox Code Playgroud)

制作的json是:

"mobile": {
    "present": false
},
Run Code Online (Sandbox Code Playgroud)

我怎样才能完全删除空白字段?

我读了这个,但它使用gson.toJson返回一个String对象,这不是我想要的方式.

POSTEDIT:

我刚刚发现即使存在,Optional也没有显示实际值,但它只显示true/false值,所以我不需要它.

java nullable guava java-8 immutables-library

2
推荐指数
1
解决办法
714
查看次数

将Kotlin与生成的Java类集成

我们使用注释处理框架(Immutables)从接口生成Java类.

现在我必须从kotlin类访问这些生成的类.虽然在Java中这很好用,但Kotlin编译器却找不到它们.

这是maven配置:

        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/main/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/test/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <executions>
                <!-- Replacing default-compile as it is treated specially by maven -->
                <execution>
                    <id>default-compile</id>
                    <phase>none</phase>
                </execution>
                <!-- Replacing default-testCompile as it is treated specially by maven -->
                <execution>
                    <id>default-testCompile</id>
                    <phase>none</phase>
                </execution>
                <execution>
                    <id>java-compile</id>
                    <phase>compile</phase>
                    <goals> <goal>compile</goal> </goals>
                </execution>
                <execution>
                    <id>java-test-compile</id>
                    <phase>test-compile</phase>
                    <goals> <goal>testCompile</goal> </goals> …
Run Code Online (Sandbox Code Playgroud)

annotation-processing kotlin immutables-library

2
推荐指数
1
解决办法
620
查看次数