feat: add support for virtual attributes on records
diff --git a/src/main/java/org/eclipse/yasson/internal/ClassParser.java b/src/main/java/org/eclipse/yasson/internal/ClassParser.java index b63dc00..793677a 100644 --- a/src/main/java/org/eclipse/yasson/internal/ClassParser.java +++ b/src/main/java/org/eclipse/yasson/internal/ClassParser.java
@@ -197,12 +197,16 @@ Method[] declaredMethods = AccessController.doPrivileged((PrivilegedAction<Method[]>) clazz::getDeclaredMethods); for (Method method : declaredMethods) { String name = method.getName(); + //isBridge method filters out methods inherited from interfaces boolean isAccessorMethod = isSpecialAccessorMethod(method, classProperties) + || isVirtualAccessorMethod(method) || isPropertyMethod(method); + if (!isAccessorMethod || method.isBridge() || isSpecialCaseMethod(clazz, method)) { continue; } + final String propertyName = method.getDeclaringClass().isRecord() ? name : toPropertyMethod(name); @@ -272,6 +276,14 @@ && classProperties.containsKey(method.getName()); } + private static boolean isVirtualAccessorMethod(Method method) { + return method.getDeclaringClass().isRecord() + && method.getParameterCount() == 0 + && !void.class.equals(method.getReturnType()) + && !"hashCode".equals(method.getName()) + && !"toString".equals(method.getName()); + } + private static void parseFields(JsonbAnnotatedElement<Class<?>> classElement, Map<String, Property> classProperties) { Field[] declaredFields = AccessController.doPrivileged( (PrivilegedAction<Field[]>) () -> classElement.getElement().getDeclaredFields());