Skip to content

Commit b7aa22a

Browse files
authored
Fix ClassCastException during deserialisation (#577)
* DSL 9.73.4 * Fixed deserialisation class cast exception * DSL update * DSL update * Renamed annotations
1 parent e8b426f commit b7aa22a

File tree

4 files changed

+32
-10
lines changed

4 files changed

+32
-10
lines changed

common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONAnnotationIntrospector.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,15 @@
2323
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
2424
import com.fasterxml.jackson.core.Version;
2525
import com.fasterxml.jackson.databind.PropertyName;
26+
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
2627
import com.fasterxml.jackson.databind.cfg.MapperConfig;
2728
import com.fasterxml.jackson.databind.introspect.*;
2829
import com.fasterxml.jackson.module.blackbird.util.CheckedFunction;
2930
import com.regnosys.rosetta.common.serialisation.BackwardsCompatibleAnnotationIntrospector;
3031
import com.regnosys.rosetta.common.serialisation.BeanUtil;
3132
import com.regnosys.rosetta.common.serialisation.mixin.legacy.LegacyRosettaBuilderIntrospector;
3233
import com.rosetta.model.lib.RosettaModelObject;
33-
import com.rosetta.model.lib.annotations.RosettaAttribute;
34-
import com.rosetta.model.lib.annotations.RosettaDataType;
35-
import com.rosetta.model.lib.annotations.RosettaIgnore;
34+
import com.rosetta.model.lib.annotations.*;
3635

3736
import java.lang.reflect.Method;
3837
import java.util.*;
@@ -68,6 +67,14 @@ public Class<?> findPOJOBuilder(AnnotatedClass ac) {
6867
.orElse(super.findPOJOBuilder(ac));
6968
}
7069

70+
@Override
71+
public JsonPOJOBuilder.Value findPOJOBuilderConfig(AnnotatedClass ac) {
72+
if (ac.hasAnnotation(RosettaDataType.class)) {
73+
return new JsonPOJOBuilder.Value("build", "set");
74+
}
75+
return super.findPOJOBuilderConfig(ac);
76+
}
77+
7178
@Override
7279
public PropertyName findNameForSerialization(Annotated a) {
7380
if (a.hasAnnotation(RosettaAttribute.class)) {
@@ -116,15 +123,23 @@ public JsonIgnoreProperties.Value findPropertyIgnoralByName(MapperConfig<?> conf
116123
public JsonIgnoreProperties.Value findPropertyIgnorals(Annotated ac) {
117124
if (ac instanceof AnnotatedClass && ac.hasAnnotation(RosettaDataType.class)) {
118125
AnnotatedClass acc = (AnnotatedClass) ac;
119-
Set<String> includes = getPropertyNames(acc, x -> x.hasAnnotation(RosettaAttribute.class));
120-
Set<String> ignored = getPropertyNames(acc, x -> !x.hasAnnotation(RosettaAttribute.class));
126+
Set<String> includes = getPropertyNames(acc, x -> shouldIncludeMethod(x));
127+
Set<String> ignored = getPropertyNames(acc, x -> !shouldIncludeMethod(x));
121128
ignored.removeAll(includes);
122129
return JsonIgnoreProperties.Value.forIgnoredProperties(ignored).withAllowSetters();
123130
}
124131

125132
return legacyRosettaBuilderIntrospector.findPropertyIgnorals(ac)
126133
.orElse(JsonIgnoreProperties.Value.empty());
127134
}
135+
136+
private boolean shouldIncludeMethod(AnnotatedMethod m) {
137+
return m.hasAnnotation(RosettaAttribute.class) && getAccessorType(m) != AccessorType.ADDER;
138+
}
139+
private AccessorType getAccessorType(Annotated m) {
140+
Accessor acc = m.getAnnotation(Accessor.class);
141+
return acc != null ? acc.value() : null;
142+
}
128143

129144
private static Set<String> getPropertyNames(AnnotatedClass acc, Predicate<AnnotatedMethod> filter) {
130145
return StreamSupport.stream(acc.memberMethods().spliterator(), false)

common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLAnnotationIntrospector.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -389,22 +389,30 @@ protected boolean _isIgnorable(Annotated a) {
389389
// except for constructors, which are necessary for deserialisation.
390390
// Additionally, the `getType` method needs to be ignored explicitly, otherwise it interferes with
391391
// xml elements named `type`, which are then always ordered on top, instead of the actual place they occur.
392-
return a.hasAnnotation(RosettaIgnore.class) && !(a instanceof AnnotatedConstructor) || a.getName().equals("getType");
392+
return (a.hasAnnotation(RosettaIgnore.class) || !shouldIncludeMember(a)) && !(a instanceof AnnotatedConstructor);
393393
}
394394

395395
@Override
396396
public JsonIgnoreProperties.Value findPropertyIgnoralByName(MapperConfig<?> config, Annotated ac) {
397397
if (ac instanceof AnnotatedClass && ac.hasAnnotation(RosettaDataType.class)) {
398398
AnnotatedClass acc = (AnnotatedClass) ac;
399-
Set<String> includes = getPropertyNames(config, acc, x -> x.hasAnnotation(RosettaAttribute.class));
400-
Set<String> ignored = getPropertyNames(config, acc, x -> !x.hasAnnotation(RosettaAttribute.class));
399+
Set<String> includes = getPropertyNames(config, acc, x -> shouldIncludeMember(x));
400+
Set<String> ignored = getPropertyNames(config, acc, x -> !shouldIncludeMember(x));
401401
ignored.removeAll(includes);
402402
return JsonIgnoreProperties.Value.forIgnoredProperties(ignored).withAllowSetters();
403403
}
404404

405405
return super.findPropertyIgnoralByName(config, ac);
406406
}
407407

408+
private boolean shouldIncludeMember(Annotated m) {
409+
return m.hasAnnotation(RosettaAttribute.class) && (!m.hasAnnotation(Multi.class) || getAccessorType(m) != AccessorType.SETTER);
410+
}
411+
private AccessorType getAccessorType(Annotated m) {
412+
Accessor acc = m.getAnnotation(Accessor.class);
413+
return acc != null ? acc.value() : null;
414+
}
415+
408416
private Set<String> getPropertyNames(MapperConfig<?> config, AnnotatedClass acc, Predicate<AnnotatedMethod> filter) {
409417
return StreamSupport.stream(acc.memberMethods().spliterator(), false)
410418
.filter(filter)

common/src/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaSerialisationTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,6 @@ void overridingMultiCardinalityToSingleTypesCanDeserialize() throws JsonProcessi
212212
}
213213

214214
@Test
215-
@Disabled // TODO
216215
void overridingMultiCardinalityTypesCanDeserialize() throws JsonProcessingException {
217216
ObjectMapper mapper = RosettaObjectMapper.getNewRosettaObjectMapper();
218217
String rosetta =

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
9292
<java.enforced.version>[21,22)</java.enforced.version>
9393
<maven.compiler.release>8</maven.compiler.release>
94-
<rosetta.dsl.version>9.73.4</rosetta.dsl.version>
94+
<rosetta.dsl.version>9.76.1</rosetta.dsl.version>
9595

9696
<!-- Release -->
9797
<gpg.keyname>configured-by-release-profile</gpg.keyname>

0 commit comments

Comments
 (0)