From d2f629e7bbdb42d112fb2d89b7bf0f123ce63b7c Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 8 Dec 2022 11:10:23 +1300 Subject: [PATCH] #2914 - Query bean generation support for @ElementCollection with validaiton annotations - NPE NullPointerException --- .../src/test/java/org/example/domain/Contact.java | 10 ++++++++-- .../src/test/resources/application-test.properties | 4 ++-- .../querybean/generator/ProcessingContext.java | 13 +++++++++++-- .../querybean/generator/ProcessingContext.java | 14 +++++++++++--- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/ebean-querybean/src/test/java/org/example/domain/Contact.java b/ebean-querybean/src/test/java/org/example/domain/Contact.java index 2b5fe9f53..44e7dbf31 100644 --- a/ebean-querybean/src/test/java/org/example/domain/Contact.java +++ b/ebean-querybean/src/test/java/org/example/domain/Contact.java @@ -3,6 +3,8 @@ package org.example.domain; import io.ebean.annotation.DbArray; import javax.persistence.*; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; @@ -16,7 +18,11 @@ import java.util.Map; public class Contact extends BaseModel { @DbArray - List phoneNumbers = new ArrayList<>(); + List<@Size(max=20) String> phoneNumbers = new ArrayList<>(); + + @ElementCollection + @Size(max=10) + List<@Size(max=20) String> paths; @Column(length = 50) String firstName; @@ -36,7 +42,7 @@ public class Contact extends BaseModel { Customer customer; @OneToMany(mappedBy = "contact") - List notes; + List<@NotNull ContactNote> notes; @OneToMany(cascade = CascadeType.PERSIST) @MapKey(name = "key") diff --git a/ebean-querybean/src/test/resources/application-test.properties b/ebean-querybean/src/test/resources/application-test.properties index fef41029d..d477b74c8 100644 --- a/ebean-querybean/src/test/resources/application-test.properties +++ b/ebean-querybean/src/test/resources/application-test.properties @@ -6,8 +6,8 @@ datasource.default=h2 datasource.h2.username=sa datasource.h2.password= -datasource.h2.url=jdbc:h2:mem:tests;NON_KEYWORDS=KEY +datasource.h2.url=jdbc:h2:mem:tests;NON_KEYWORDS=KEY,VALUE datasource.pg.username=sa datasource.pg.password= -datasource.pg.url=jdbc:h2:mem:tests;NON_KEYWORDS=KEY +datasource.pg.url=jdbc:h2:mem:tests;NON_KEYWORDS=KEY,VALUE diff --git a/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java b/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java index 6ef2960ba..b95070745 100644 --- a/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java +++ b/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java @@ -146,6 +146,15 @@ class ProcessingContext implements Constants { } } + private String trimAnnotations(String type) { + int pos = type.indexOf("@"); + if (pos == -1) { + return type; + } + String remainder = type.substring(0, pos) + type.substring(type.indexOf(' ') + 1); + return trimAnnotations(remainder); + } + /** * Gather all the fields (properties) for the given bean element. */ @@ -324,9 +333,9 @@ class ProcessingContext implements Constants { } if (typeInstanceOf(typeMirror, "java.lang.Comparable")) { - return new PropertyTypeScalarComparable(typeMirror.toString()); + return new PropertyTypeScalarComparable(trimAnnotations(typeMirror.toString())); } else { - return new PropertyTypeScalar(typeMirror.toString()); + return new PropertyTypeScalar(trimAnnotations(typeMirror.toString())); } } diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java index 099bc0eab..7e65a7363 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java @@ -4,7 +4,6 @@ import javax.annotation.processing.Filer; import javax.annotation.processing.FilerException; import javax.annotation.processing.Messager; import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.SourceVersion; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; @@ -231,6 +230,15 @@ class ProcessingContext implements Constants { } } + private String trimAnnotations(String type) { + int pos = type.indexOf("@"); + if (pos == -1) { + return type; + } + String remainder = type.substring(0, pos) + type.substring(type.indexOf(' ') + 1); + return trimAnnotations(remainder); + } + PropertyType getPropertyType(VariableElement field) { TypeMirror typeMirror = field.asType(); @@ -296,9 +304,9 @@ class ProcessingContext implements Constants { return result; } else { if (typeInstanceOf(typeMirror, "java.lang.Comparable")) { - return new PropertyTypeScalarComparable(typeMirror.toString()); + return new PropertyTypeScalarComparable(trimAnnotations(typeMirror.toString())); } else { - return new PropertyTypeScalar(typeMirror.toString()); + return new PropertyTypeScalar(trimAnnotations(typeMirror.toString())); } } }