Skip to content

Commit b5ae1e8

Browse files
committed
Fix #325
1 parent 2bc25e4 commit b5ae1e8

File tree

6 files changed

+118
-16
lines changed

6 files changed

+118
-16
lines changed

release-notes/VERSION-2.x

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Project: jackson-dataformat-xml
88

99
#242: Deserialization of class inheritance depends on attributes order
1010
(reported by Victor K)
11+
#325: Problem with '$' in polymorphic type id names when "as class",
12+
"wrapper object", inner class
1113
#326: Force namespace-repairing on `XMLOutputFactory` instances
1214
#354: Support mapping `xsi:nul` marked elements as `null`s (`JsonToken.VALUE_NULL`)
1315

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.fasterxml.jackson.dataformat.xml;
2+
3+
import java.util.Collection;
4+
5+
import com.fasterxml.jackson.annotation.JsonTypeInfo;
6+
import com.fasterxml.jackson.databind.*;
7+
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
8+
import com.fasterxml.jackson.databind.cfg.MapperConfig;
9+
import com.fasterxml.jackson.databind.jsontype.NamedType;
10+
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
11+
import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
12+
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
13+
14+
import com.fasterxml.jackson.dataformat.xml.util.StaxUtil;
15+
16+
/**
17+
* Sub-class of {@code StdTypeResolverBuilder} specifically used with
18+
* Default Typing.
19+
*<p>
20+
* Composition/sub-classing gets quite tricky here: ideally we would just
21+
* extend {@link XmlTypeResolverBuilder} but unfortunately inheritance hierarchy
22+
* does not allow this.
23+
*
24+
* @since 2.10
25+
*/
26+
public class DefaultingXmlTypeResolverBuilder
27+
extends ObjectMapper.DefaultTypeResolverBuilder
28+
implements java.io.Serializable
29+
{
30+
private static final long serialVersionUID = 1L;
31+
32+
public DefaultingXmlTypeResolverBuilder(DefaultTyping t, PolymorphicTypeValidator ptv) {
33+
super(t, ptv);
34+
}
35+
36+
/*
37+
/**********************************************************************
38+
/* Methods copied from `XmlTypeResolverBuilder`
39+
/**********************************************************************
40+
*/
41+
42+
@Override
43+
public StdTypeResolverBuilder init(JsonTypeInfo.Id idType, TypeIdResolver idRes)
44+
{
45+
super.init(idType, idRes);
46+
if (_typeProperty != null) {
47+
_typeProperty = StaxUtil.sanitizeXmlTypeName(_typeProperty);
48+
}
49+
return this;
50+
}
51+
52+
@Override
53+
public StdTypeResolverBuilder typeProperty(String typeIdPropName)
54+
{
55+
// ok to have null/empty; will restore to use defaults
56+
if (typeIdPropName == null || typeIdPropName.length() == 0) {
57+
typeIdPropName = _idType.getDefaultPropertyName();
58+
}
59+
_typeProperty = StaxUtil.sanitizeXmlTypeName(typeIdPropName);
60+
return this;
61+
}
62+
63+
@Override
64+
protected TypeIdResolver idResolver(MapperConfig<?> config,
65+
JavaType baseType, PolymorphicTypeValidator subtypeValidator,
66+
Collection<NamedType> subtypes, boolean forSer, boolean forDeser)
67+
{
68+
if (_customIdResolver != null) {
69+
return _customIdResolver;
70+
}
71+
// Only override handlers of class, minimal class; name is good as is
72+
switch (_idType) {
73+
case CLASS:
74+
return new XmlTypeResolverBuilder.XmlClassNameIdResolver(baseType, config.getTypeFactory(),
75+
subTypeValidator(config));
76+
case MINIMAL_CLASS:
77+
return new XmlTypeResolverBuilder.XmlMinimalClassNameIdResolver(baseType, config.getTypeFactory(),
78+
subTypeValidator(config));
79+
default:
80+
}
81+
return super.idResolver(config, baseType, subtypeValidator, subtypes, forSer, forDeser);
82+
}
83+
}

src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,7 @@ public Version version() {
212212
@Override // since 2.10
213213
protected TypeResolverBuilder<?> _constructDefaultTypeResolverBuilder(DefaultTyping applicability,
214214
PolymorphicTypeValidator ptv) {
215-
// return DefaultTypeResolverBuilder.cosntruct(applicability, ptv);
216-
// just a stub for now
217-
return super._constructDefaultTypeResolverBuilder(applicability, ptv);
215+
return new DefaultingXmlTypeResolverBuilder(applicability, ptv);
218216
}
219217

220218
/*

src/main/java/com/fasterxml/jackson/dataformat/xml/XmlTypeResolverBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.Collection;
55

66
import com.fasterxml.jackson.annotation.JsonTypeInfo;
7+
78
import com.fasterxml.jackson.databind.*;
89
import com.fasterxml.jackson.databind.cfg.MapperConfig;
910
import com.fasterxml.jackson.databind.jsontype.NamedType;
@@ -13,6 +14,7 @@
1314
import com.fasterxml.jackson.databind.jsontype.impl.MinimalClassNameIdResolver;
1415
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
1516
import com.fasterxml.jackson.databind.type.TypeFactory;
17+
1618
import com.fasterxml.jackson.dataformat.xml.util.StaxUtil;
1719

1820
/**
@@ -25,6 +27,7 @@ public class XmlTypeResolverBuilder extends StdTypeResolverBuilder
2527
@Override
2628
public StdTypeResolverBuilder init(JsonTypeInfo.Id idType, TypeIdResolver idRes)
2729
{
30+
2831
super.init(idType, idRes);
2932
if (_typeProperty != null) {
3033
_typeProperty = StaxUtil.sanitizeXmlTypeName(_typeProperty);
Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,36 @@
11
package com.fasterxml.jackson.dataformat.xml.failing;
22

33
import java.io.IOException;
4-
import java.util.Arrays;
5-
import java.util.List;
64

75
import com.fasterxml.jackson.annotation.JsonTypeInfo;
86
import com.fasterxml.jackson.databind.ObjectMapper;
7+
98
import com.fasterxml.jackson.dataformat.xml.XmlTestBase;
109
import com.fasterxml.jackson.dataformat.xml.testutil.NoCheckSubTypeValidator;
1110

1211
public class DefaultTyping325Test extends XmlTestBase
1312
{
14-
static class Simple {
15-
protected List<String> list;
13+
static class Simple325 {
14+
protected String[] list;
1615

17-
public List<String> getList( ) { return list; }
18-
public void setList(List<String> l) { list = l; }
16+
public String[] getList( ) { return list; }
17+
public void setList(String[] l) { list = l; }
1918
}
2019

21-
public void testCanSerialize() throws IOException
20+
// [dataformat-xml#325]
21+
public void testDefaultTypingWithInnerClass() throws IOException
2222
{
2323
ObjectMapper mapper = mapperBuilder()
2424
.activateDefaultTyping(NoCheckSubTypeValidator.instance,
2525
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_OBJECT)
2626
.build();
2727

28-
// construct test object
29-
Simple s = new Simple();
30-
s.setList(Arrays.asList("foo", "bar"));
28+
Simple325 s = new Simple325();
29+
s.setList(new String[] { "foo", "bar" });
3130

3231
String doc = mapper.writeValueAsString(s);
33-
Simple result = mapper.readValue(doc, Simple.class);
32+
Simple325 result = mapper.readValue(doc, Simple325.class);
3433
assertNotNull(result.list);
35-
assertEquals(2, result.list.size());
34+
assertEquals(2, result.list.length);
3635
}
3736
}

src/test/java/com/fasterxml/jackson/dataformat/xml/testutil/NoCheckSubTypeValidator.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,21 @@ public final class NoCheckSubTypeValidator
1919
public Validity validateBaseType(MapperConfig<?> c, JavaType baseType) {
2020
return Validity.ALLOWED;
2121
}
22-
}
22+
23+
// Important! With Default Typing, "validateBaseType()" won't necessarily
24+
// be called, at least for root type, so need more than above method:
25+
26+
@Override
27+
public Validity validateSubClassName(MapperConfig<?> config,
28+
JavaType baseType, String subClassName) {
29+
return Validity.ALLOWED;
30+
}
31+
32+
/*
33+
@Override
34+
public Validity validateSubType(MapperConfig<?> config, JavaType baseType,
35+
JavaType subType) {
36+
return Validity.ALLOWED;
37+
}
38+
*/
39+
}

0 commit comments

Comments
 (0)