This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new ce46582575 Marshall module improvements
ce46582575 is described below

commit ce465825755feb95d8a46cc9ed71f0be2c83be58
Author: James Bognar <[email protected]>
AuthorDate: Mon Dec 8 18:06:10 2025 -0500

    Marshall module improvements
---
 .../src/main/java/org/apache/juneau/BeanMeta.java  | 29 ++++++++++++++++++----
 .../src/main/java/org/apache/juneau/ClassMeta.java | 18 +++-----------
 2 files changed, 27 insertions(+), 20 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index ac85da45f0..b281bac58c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -80,6 +80,21 @@ public class BeanMeta<T> {
                Optional<String> optNotABeanReason() { return 
opt(notABeanReason()); }
        }
 
+       /**
+        * Finds the bean filter for the specified class metadata.
+        *
+        * @param <T> The class type.
+        * @param cm The class metadata to find the filter for.
+        * @return The bean filter, or <jk>null</jk> if no filter is found.
+        */
+       static <T> BeanFilter findBeanFilter(ClassMeta<T> cm) {
+               var ap = cm.getBeanContext().getAnnotationProvider();
+               var l = ap.find(Bean.class, cm);
+               if (l.isEmpty())
+                       return null;
+               return 
BeanFilter.create(cm.inner()).applyAnnotations(reverse(l.stream().map(AnnotationInfo::inner).toList())).build();
+       }
+
        /**
         * Creates a {@link BeanMeta} instance for the specified class metadata.
         *
@@ -133,7 +148,7 @@ public class BeanMeta<T> {
         * @param implClassConstructor Optional constructor to use if one 
cannot be found. Can be <jk>null</jk>.
         * @return A {@link BeanMetaValue} containing the bean metadata (if 
successful) or a reason why it's not a bean.
         */
-       public static <T> BeanMetaValue<T> create(ClassMeta<T> cm, BeanFilter 
bf, String[] pNames, ConstructorInfo implClassConstructor) {
+       public static <T> BeanMetaValue<T> create(ClassMeta<T> cm, String[] 
pNames, ConstructorInfo implClassConstructor) {
                try {
                        var bc = cm.getBeanContext();
                        var ap = bc.getAnnotationProvider();
@@ -142,7 +157,7 @@ public class BeanMeta<T> {
                        if (bc.isNotABean(cm))
                                return notABean("Class matches exclude-class 
list");
 
-                       if (bf == null && bc.isBeansRequireSerializable() && ! 
cm.isChildOf(Serializable.class))
+                       if (bc.isBeansRequireSerializable() && ! 
cm.isChildOf(Serializable.class) && ! ap.has(Bean.class, cm))
                                return notABean("Class is not serializable");
 
                        if (ap.has(BeanIgnore.class, cm))
@@ -151,7 +166,7 @@ public class BeanMeta<T> {
                        if ((! 
bc.getBeanClassVisibility().isVisible(cm.getModifiers()) || 
cm.isAnonymousClass()) && ! ap.has(Bean.class, cm))
                                return notABean("Class is not public");
 
-                       var bm = new BeanMeta<>(cm, bf, pNames, 
implClassConstructor);
+                       var bm = new BeanMeta<>(cm, findBeanFilter(cm), pNames, 
implClassConstructor);
                        var nabr = bm.notABeanReason;
                        return new BeanMetaValue<>(nabr == null ? bm : null, 
nabr);
                } catch (RuntimeException e) {
@@ -843,6 +858,10 @@ public class BeanMeta<T> {
        /** Optional bean filter associated with the target class. */
        protected final BeanFilter beanFilter;
 
+       public BeanFilter getBeanFilter() {
+               return beanFilter;
+       }
+
        /** The constructor for this bean. */
        protected final ConstructorInfo constructor;
 
@@ -924,11 +943,11 @@ public class BeanMeta<T> {
         * @param implClassConstructor The constructor to use if one cannot be 
found.  Can be <jk>null</jk>.
         */
        protected BeanMeta(ClassMeta<T> classMeta, BeanFilter beanFilter, 
String[] pNames, ConstructorInfo implClassConstructor) {
-
-               Builder<T> b = new Builder<>(classMeta, 
classMeta.getBeanContext(), beanFilter, pNames, implClassConstructor);
                this.classMeta = classMeta;
                this.ctx = classMeta.getBeanContext();
                this.c = classMeta.inner();
+
+               Builder<T> b = new Builder<>(classMeta, 
classMeta.getBeanContext(), beanFilter, pNames, implClassConstructor);
                notABeanReason = b.init(this);
 
                this.beanFilter = beanFilter;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index efc4c74479..d9133c07b3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -139,7 +139,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
 
        private final List<ClassMeta<?>> args;                                  
   // Arg types if this is an array of args.
        private final BeanContext beanContext;                                  
   // The bean context that created this object.
-       private final OptionalSupplier<BeanFilter> beanFilter;
        private final Supplier<BuilderSwap<T,?>> builderSwap;                   
   // The builder swap associated with this bean (if it has one).
        private final Categories cat;                                           
   // The class category.
        private final Cache<Class<?>,ObjectSwap<?,?>> childSwapMap;             
   // Maps normal subclasses to ObjectSwaps.
@@ -238,7 +237,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                                cat.set(INPUTSTREAM);
                        }
 
-                       beanFilter = memoize(()->findBeanFilter());
                        beanMeta = memoize(()->findBeanMeta());
                        builderSwap = memoize(()->findBuilderSwap());
                        childSwapMap = 
Cache.<Class<?>,ObjectSwap<?,?>>create().supplier(x -> findSwap(x)).build();
@@ -298,7 +296,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                this.exampleField = memoize(()->findExampleField());
                this.noArgConstructor = memoize(()->findNoArgConstructor());
                this.stringConstructor = memoize(()->findStringConstructor());
-               this.beanFilter = memoize(()->findBeanFilter());
                this.marshalledFilter = memoize(()->findMarshalledFilter());
                this.builderSwap = memoize(()->findBuilderSwap());
                this.example = memoize(()->findExample());
@@ -333,7 +330,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                this.exampleField = mainType.exampleField;
                this.noArgConstructor = mainType.noArgConstructor;
                this.stringConstructor = mainType.stringConstructor;
-               this.beanFilter = mainType.beanFilter;
                this.marshalledFilter = mainType.marshalledFilter;
                this.builderSwap = mainType.builderSwap;
                this.example = mainType.example;
@@ -1319,18 +1315,10 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                        .orElse(null);
        }
 
-       private BeanFilter findBeanFilter() {
-               var ap = beanContext.getAnnotationProvider();
-               var l = ap.find(Bean.class, this);
-               if (l.isEmpty())
-                       return null;
-               return 
BeanFilter.create(inner()).applyAnnotations(reverse(l.stream().map(AnnotationInfo::inner).toList())).build();
-       }
-
        private BeanMeta.BeanMetaValue<T> findBeanMeta() {
                if (! cat.isUnknown())
                        return new BeanMeta.BeanMetaValue<>(null, "Known 
non-bean type");
-               return BeanMeta.create(this, beanFilter.get(), null, 
implClass.map(x -> x.getPublicConstructor(x2 -> 
x2.hasNumParameters(0)).orElse(null)).orElse(null));
+               return BeanMeta.create(this, null, implClass.map(x -> 
x.getPublicConstructor(x2 -> 
x2.hasNumParameters(0)).orElse(null)).orElse(null));
        }
 
        private KeyValueTypes findKeyValueTypes() {
@@ -1431,7 +1419,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
        @SuppressWarnings("unchecked")
        private String findExample() {
 
-               var example = beanFilter.map(x -> x.getExample()).orElse(null);
+               var example = beanMeta.get().optBeanMeta().map(x -> 
x.getBeanFilter()).map(x -> x.getExample()).orElse(null);
 
                if (example == null)
                        example = marshalledFilter.map(x -> 
x.getExample()).orElse(null);
@@ -1512,7 +1500,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                if (is(Object.class))
                        return null;
 
-               var v = beanFilter.map(x -> 
x.getImplClass()).map(ReflectionUtils::info).orElse(null);
+               var v = beanContext.getAnnotationProvider().find(Bean.class, 
this).stream().map(x -> x.inner()).filter(x -> ne(x.implClass(), 
void.class)).map(x -> ClassInfo.of(x)).findFirst().orElse(null);
 
                if (v == null)
                        v = marshalledFilter.map(x -> 
x.getImplClass()).map(ReflectionUtils::info).orElse(null);

Reply via email to