我使用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)
我试图provided用compileOnly和替换compile,但是然后@Value.Immutable没有生成带注释的接口的实现.
我如何使其工作?
使用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
我有一些使用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()
我应该看注释注射吗?
我正在尝试找到一种使用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库生成的类进行接口连接?
如何在 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) 我正在尝试将该immutables库与 vscode(和 Gradle)一起使用。
我采取的步骤:
jar存在GRADLE_USER_HOME变量存在(最初没有)gradle build我一直挂在环境变量上。GRADLE_USER_HOME与GRADLE_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
如果我必须测试使用可变实体的服务,我将构建我需要的最小对象(真实的)并将其传递给我的服务.例:
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,....]
在构建器尝试构建对象时,它在构建器中失败.所以我该怎么做?
@Nullable并让构建器不验证对象?这会让我面临生产中不完整物品的风险,对吧?我知道用户应该是实体而不是不可变的值对象.我在这个例子中使用了User,因为它很容易理解.
我目前正在使用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值,所以我不需要它.
我们使用注释处理框架(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) java ×7
build.gradle ×1
gradle ×1
guava ×1
java-8 ×1
java-9 ×1
java-platform-module-system ×1
kotlin ×1
mapstruct ×1
maven ×1
mockito ×1
nullable ×1
object ×1
spring-boot ×1
unit-testing ×1