我有以下EventDTO课程:
@AutoValue
@JsonDeserialize(builder = AutoValue_Event.Builder.class)
@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class Event {
public static Event.Builder builder() {
return new AutoValue_Event.Builder();
}
public abstract UUID id();
@NotNull
public abstract Type type();
@NotNull
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
public abstract LocalDate date();
@AutoValue.Builder
public abstract static class Builder {
@JsonProperty("id")
public abstract Builder id(UUID id);
@JsonProperty("type")
public abstract Builder type(Type type);
@JsonProperty("date")
public abstract Builder date(LocalDate date);
}
}
Run Code Online (Sandbox Code Playgroud)
验证适用于type和date属性,并且JsonMappingException当有效负载不正确时,杰克逊会按预期抛出.不幸的是,返回的错误消息text/plain如下: …
我使用google/auto-value在 maven 项目中创建不可变的值类。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
[...]
<packaging>war</packaging>
<properties>
<auto-value.version>1.7</auto-value.version>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>com.google.auto.value</groupId>
<artifactId>auto-value</artifactId>
<version>${auto-value.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.google.auto.value</groupId>
<artifactId>auto-value-annotations</artifactId>
<version>${auto-value.version}</version>
</dependency>
[...]
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)
这就像使用 CLI(例如mvn clean test)的魅力一样,但在 IntelliJ 项目构建期间会产生错误:
Error:java: java.lang.NoClassDefFoundError: com/google/auto/service/AutoService
com.google.auto.service.AutoService
Run Code Online (Sandbox Code Playgroud)
值得注意的是:正确的源代码生成到generated-sources/annotations/...但在这一步之后 IntelliJ 构建失败并且不会创建生成的测试源目录generated-test-sources/...。
虽然可以通过将另一个注释处理器路径添加到 maven-compiler-plugin
<path>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
<version>1.0-rc6</version>
</path>
Run Code Online (Sandbox Code Playgroud)
此修复程序的缺点是auto-service在 …
@AutoValue
public abstract class Office {
public static Builder builder() {
return new AutoValue_Office.Builder();
}
public abstract double latitud();
public abstract double longitud();
@AutoValue.Builder
public static abstract class Builder {
public abstract Builder latitud(double latitud);
public abstract Builder longitud(double longitud);
public abstract Office build();
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我打电话给Office office = childDataSnapshot.getValue(Office.class);我时,我收到了这个错误:
com.google.firebase.database.DatabaseException: No properties to serialize found on class com.example.app.model.Office
Run Code Online (Sandbox Code Playgroud)
有人知道我为什么会收到这个错误以及如何解决它?我读到firebase不再jackson用于json序列化.所以我不确定如何指定一种@JsonProperty("latitud")我用过的@PropertyName失败.
我也尝试重命名抽象方法public abstract double getLatitud();,然后错误是下一个:
java.lang.InstantiationException: …Run Code Online (Sandbox Code Playgroud) 我正在使用改进版本2.1.0将JSON反序列化为pojos.pojo中的字段可以在json中以不同的名称接收.要正确地反序列化字段,我使用@serializedName注释以下列方式:
@AutoValue
public abstract class Media implements Parcelable {
@SerializedName(value = "title", alternate = {"name"})
public abstract String title();
// More fields and code
Run Code Online (Sandbox Code Playgroud)
但是,由于某种原因,当生成的JSON在键"title"下有字段时,Gson会正确读取它,但是当该字段与"name"键相关联时,它不会被读取.
如何在反序列化期间让GSON识别备用名称?
TLDR;
JDBI@BindBean批注生成一个IllegalAccessExceptionwith AutoValue 生成的类型,因为生成的类型是包私有的,默认情况下无法使用反射访问。
JDBI 是否不灵活,或者是否有通过 AutoValue 的解决方法?(完整问题如下)
快速背景
我正在尝试将 JDBI@BindBean注释与使用 AutoValue 生成源的类型一起使用。
package com.example;
@AutoValue
public abstract class Foo {
public String getBar();
}
Run Code Online (Sandbox Code Playgroud)
问题是生成的代码如下所示:
package com.example;
@AutoValue
class AutoValue_Foo extends Foo {
private final String bar;
@Override
public String getBar() {
return this.bar;
}
// toString, equals, hashCode
}
Run Code Online (Sandbox Code Playgroud)
注意这个类是包私有的!
现在,如果我尝试使用@BindBean,例如:
@SqlQuery("select * from baz where bar = :foo.bar")
Condition find(@BindBean("foo") Foo foo);
Run Code Online (Sandbox Code Playgroud)
因为AutoValue_Foo是包私有的,并且BindBeanFactory使用反射,如果尝试find使用 …
在我maven-dependency-plugin用来检测未使用的依赖项的mvn项目中,似乎没有scope我可以为Google的AutoValue(com.google.auto.value:auto-value)指定的依赖性,这将说服插件使用依赖项,尽管包中的注释正在被使用使用(例如@AutoValue),如果auto-value排除,项目将不会建立.
现在一个解决方案就是在我的插件中添加一个配置条目:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<usedDependencies>
<usedDependency>com.google.auto.value:auto-value</usedDependency>
</usedDependencies>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但我很想知道是否可以以检测每个注释使用依赖关系的方式配置条目maven-dependency-plugin或dependency条目auto-value?
我怀疑这是不可能的,因为RetentionPolicy我从自动值中使用的注释RetentionPolicy.SOURCE是由编译器丢弃的并且被编译器丢弃.它是否正确?
我正在运行Eclipse Kepler SR2,并附带了带有m2e和m2e-apt插件的Maven 3.1.1,但出现错误,我不知道如何解决。
我设法找到了@AutoValue进入pom.xml 所需的所有依赖关系,但是现在我处于一种状态,即只有在需要定义的方法都具有原始返回类型的情况下,该状态才有效。如果我提供了一个返回一个Object或更具体值的抽象getter,则会出现此错误:
@AutoValue processor threw an exception:
java.lang.IllegalArgumentException:
Failed to invoke com.google.auto.value.processor.AutoValueProcessor$Property.nullable() on getObject...
Run Code Online (Sandbox Code Playgroud)
我已经尝试了基础知识-清除了Maven缓存,重新启动了Eclipse,重建了项目...没有骰子。因此,我深入研究了源代码,发现了一个不一致之处,不确定该如何解决。
在用于生成的AutoValue类的Velocity模板中,存在一些基本逻辑,用于以不同于对象的方式渲染图元,例如,在第37行,p.nullable已被检查。的p变量是的一个实例AutoValueProcessor$Property的类,其中,因为可以在前述连杆的205行可以看到,有一个isNullable()方法,但是没有nullable方法或属性。
那么Velocity渲染阶段打算如何工作?Velocity是否会自动扩展p.nullable为p.isNullable某种方式,但由于原因而不适合我?这是错误吗?我不确定从这里做什么。
无法编译的示例类:
@AutoValue
public abstract class Point {
public static Point of(double x, double y) {
return new AutoValue_Point(x, y);
}
public abstract Double x();
public abstract Double y();
}
Run Code Online (Sandbox Code Playgroud)
Eclipse Point在类声明的开头强调了所描述的错误。
我试图找到一种方法来使用AutoValue将JSON obj反序列化为Java类(也是Parcelable)
JSON响应通常采用以下形式:
{
"varKey1": {
"occupations": [
{
"value": "val1",
"name": "name1"
},
{
"value": "val2",
"name": "name2"
}
]
},
"varKey2": {
"occupations": [
{
"value": "val1",
"name": "name1"
},
{
"value": "val2",
"name": "name2"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
where varKey1和varKey2是不固定/预定义的字符串,因此可以有任何值.
尽管使用AutoValue Gson,我很难弄清楚这个类型的适配器应该是什么样子,对此的任何帮助都将非常感激.
我最近和建筑师一起玩自动值.而且我遇到这种情况,比如我必须将现有对象转换为新对象,并更新一些属性.示例代码在这里:
@AutoValue
public abstract class SomeObject {
public static Builder builder() {
...
}
public abstract String prop1();
public abstract int prop2();
// Populate a builder using the current instance.
public Builder newBuilder() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
注意我写了一个newBuilder方法,以便我可以像这样进行转换:
SomeObject resultedObject = originObject.newBuilder()
.setProp2(99)
.build();
Run Code Online (Sandbox Code Playgroud)
是的,我可以这样写newBuilder:
public Builder newBuilder() {
return new AutoValue_SomeObject.Builder()
.setProp1(this.prop1())
.setProp2(this.prop2());
}
Run Code Online (Sandbox Code Playgroud)
但应该有更好的方法,特别是在处理现实生活中的复杂物体时.像这样的东西更好:
public Builder newBuilder() {
return new AutoValue_SomeObject.Builder(this);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,生成的构造函数Builder(SomeObject)是私有的,我找不到任何对它的引用.
那你对这个问题的看法是什么?
AutoValue版本是1.4-rc2.提前致谢.
我有以下设置:
项目A build.grade:
dependencies {
compile (project(':ProjectB'))
}
Run Code Online (Sandbox Code Playgroud)
项目B build.gradle:
dependencies {
annotationProcessor 'com.ryanharter.auto.value:auto-value-parcel:0.2.5'
compile "com.google.auto.value:auto-value:1.3"
annotationProcessor "com.google.auto.value:auto-value:1.3"
}
Run Code Online (Sandbox Code Playgroud)
而SomeClass在项目A,而实现Parcelable
@AutoValue
public abstract class SomeClass implements Parcelable {
...
}
Run Code Online (Sandbox Code Playgroud)
AutoValue 不会在 AutoValue_SomeClass 中生成任何 Parcelable 相关的方法。
但是,如果我将 auto-value-parcel annotationProcessor 直接包含到 ProjectA 中,问题就解决了。
项目A build.grade:
dependencies {
compile (project(':projectB'))
annotationProcessor 'com.ryanharter.auto.value:auto-value-parcel:0.2.5'
}
Run Code Online (Sandbox Code Playgroud)
谁能解释一下auto-value-parcelannotationProcessor 是如何从 ProjectA 中排除的?
我试图拥有我创建的 AutoValue 定义对象的 PCollection,并且我添加了适当的注释以通过DefaultSchema(AutoValueSchema.class). 就像这样:
@DefaultSchema(AutoValueSchema.class)
@AutoValue
public abstract class MyAutoClas {
public abstract String getMyStr();
public abstract Integer getMyInt();
@CreateSchema
public static MyAutoClass create(String myStr, Integer myInt) {
return new AutoValue_MyAutoClass(myStr, myInt);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个小测试用例,如下所示:
PCollection<KV<String, MyAutoClass>> result = pipeline
.apply(Create.of(MyAutoClass.create("abc", 1)))
.apply(WithKeys.of(in -> in.getMyStr()));
PAssert.that(result).containsInAnyOrder(KV.of("abc", MyAutoClass.create("abc", 1)));
pipeline.run().waitUntilFinish();
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此程序时,我看到以下错误:
[ERROR] testMyAutoValueClass(.....) Time elapsed: 1.891 s <<< ERROR!
java.lang.RuntimeException: Creator parameter arg0 Doesn't correspond to a schema field
at org.apache.beam.sdk.schemas.utils.ByteBuddyUtils$InvokeUserCreateInstruction.<init>(ByteBuddyUtils.java:717)
at org.apache.beam.sdk.schemas.utils.ByteBuddyUtils$StaticFactoryMethodInstruction.<init>(ByteBuddyUtils.java:660)
at org.apache.beam.sdk.schemas.utils.JavaBeanUtils.createStaticCreator(JavaBeanUtils.java:284)
at org.apache.beam.sdk.schemas.utils.JavaBeanUtils.lambda$getStaticCreator$4(JavaBeanUtils.java:273)
at …Run Code Online (Sandbox Code Playgroud)