Skip to content

Commit 564c570

Browse files
authored
Fix incorrect reflection call to Jackson XML API (#41252)
Fix incorrect reflection call to Jackson XML API
1 parent 138cedf commit 564c570

File tree

2 files changed

+26
-30
lines changed
  • sdk/core

2 files changed

+26
-30
lines changed

sdk/core/azure-core-serializer-json-jackson/src/main/java/com/azure/core/serializer/json/jackson/implementation/XmlMapperFactory.java

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,14 @@
33

44
package com.azure.core.serializer.json.jackson.implementation;
55

6-
import com.azure.core.implementation.ReflectiveInvoker;
76
import com.azure.core.implementation.ReflectionUtils;
7+
import com.azure.core.implementation.ReflectiveInvoker;
88
import com.azure.core.util.logging.ClientLogger;
99
import com.azure.core.util.logging.LogLevel;
1010
import com.fasterxml.jackson.databind.ObjectMapper;
1111
import com.fasterxml.jackson.databind.cfg.MapperBuilder;
1212
import com.fasterxml.jackson.databind.cfg.PackageVersion;
1313

14-
import java.lang.reflect.Array;
15-
1614
/**
1715
* Constructs and configures {@link ObjectMapper} instances that handle XML.
1816
*/
@@ -25,9 +23,9 @@ public final class XmlMapperFactory {
2523
private static final String TO_XML_GENERATOR = "com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator$Feature";
2624
private final ReflectiveInvoker createXmlMapperBuilder;
2725
private final ReflectiveInvoker defaultUseWrapper;
28-
private final ReflectiveInvoker enableWriteXmlDeclaration;
26+
private final ReflectiveInvoker configureWriteXmlDeclaration;
2927
private final Object writeXmlDeclaration;
30-
private final ReflectiveInvoker enableEmptyElementAsNull;
28+
private final ReflectiveInvoker configureEmptyElementAsNull;
3129
private final Object emptyElementAsNull;
3230

3331
private final boolean useJackson212;
@@ -38,9 +36,9 @@ public final class XmlMapperFactory {
3836
private XmlMapperFactory() {
3937
ReflectiveInvoker createXmlMapperBuilder;
4038
ReflectiveInvoker defaultUseWrapper;
41-
ReflectiveInvoker enableWriteXmlDeclaration;
39+
ReflectiveInvoker configureWriteXmlDeclaration;
4240
Object writeXmlDeclaration;
43-
ReflectiveInvoker enableEmptyElementAsNull;
41+
ReflectiveInvoker configureEmptyElementAsNull;
4442
Object emptyElementAsNull;
4543
try {
4644
Class<?> xmlMapper = Class.forName(XML_MAPPER);
@@ -53,11 +51,11 @@ private XmlMapperFactory() {
5351
defaultUseWrapper = ReflectionUtils.getMethodInvoker(xmlMapperBuilder,
5452
xmlMapperBuilder.getDeclaredMethod("defaultUseWrapper", boolean.class), false);
5553

56-
enableWriteXmlDeclaration = ReflectionUtils.getMethodInvoker(xmlMapperBuilder,
57-
xmlMapperBuilder.getDeclaredMethod("enable", Array.newInstance(toXmlGenerator, 0).getClass()), false);
54+
configureWriteXmlDeclaration = ReflectionUtils.getMethodInvoker(xmlMapperBuilder,
55+
xmlMapperBuilder.getDeclaredMethod("configure", toXmlGenerator, boolean.class), false);
5856
writeXmlDeclaration = toXmlGenerator.getDeclaredField("WRITE_XML_DECLARATION").get(null);
59-
enableEmptyElementAsNull = ReflectionUtils.getMethodInvoker(xmlMapperBuilder,
60-
xmlMapperBuilder.getDeclaredMethod("enable", Array.newInstance(fromXmlParser, 0).getClass()), false);
57+
configureEmptyElementAsNull = ReflectionUtils.getMethodInvoker(xmlMapperBuilder,
58+
xmlMapperBuilder.getDeclaredMethod("configure", fromXmlParser, boolean.class), false);
6159
emptyElementAsNull = fromXmlParser.getDeclaredField("EMPTY_ELEMENT_AS_NULL").get(null);
6260
} catch (Throwable ex) {
6361
// Throw the Error only if it isn't a LinkageError.
@@ -74,9 +72,9 @@ private XmlMapperFactory() {
7472

7573
this.createXmlMapperBuilder = createXmlMapperBuilder;
7674
this.defaultUseWrapper = defaultUseWrapper;
77-
this.enableWriteXmlDeclaration = enableWriteXmlDeclaration;
75+
this.configureWriteXmlDeclaration = configureWriteXmlDeclaration;
7876
this.writeXmlDeclaration = writeXmlDeclaration;
79-
this.enableEmptyElementAsNull = enableEmptyElementAsNull;
77+
this.configureEmptyElementAsNull = configureEmptyElementAsNull;
8078
this.emptyElementAsNull = emptyElementAsNull;
8179

8280
this.useJackson212 = PackageVersion.VERSION.getMinorVersion() >= 12;
@@ -95,13 +93,13 @@ public ObjectMapper createXmlMapper() {
9593
.initializeMapperBuilder((MapperBuilder<?, ?>) createXmlMapperBuilder.invokeStatic());
9694

9795
defaultUseWrapper.invokeWithArguments(xmlMapperBuilder, false);
98-
enableWriteXmlDeclaration.invokeWithArguments(xmlMapperBuilder, writeXmlDeclaration);
96+
configureWriteXmlDeclaration.invokeWithArguments(xmlMapperBuilder, writeXmlDeclaration, true);
9997

10098
/*
10199
* In Jackson 2.12 the default value of this feature changed from true to false.
102100
* https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.12#xml-module
103101
*/
104-
enableEmptyElementAsNull.invokeWithArguments(xmlMapperBuilder, emptyElementAsNull);
102+
configureEmptyElementAsNull.invokeWithArguments(xmlMapperBuilder, emptyElementAsNull, true);
105103

106104
xmlMapper = xmlMapperBuilder.build();
107105
} catch (Exception ex) {

sdk/core/azure-core/src/main/java/com/azure/core/implementation/jackson/XmlMapperFactory.java

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,14 @@
33

44
package com.azure.core.implementation.jackson;
55

6-
import com.azure.core.implementation.ReflectiveInvoker;
76
import com.azure.core.implementation.ReflectionUtils;
7+
import com.azure.core.implementation.ReflectiveInvoker;
88
import com.azure.core.util.logging.ClientLogger;
99
import com.azure.core.util.logging.LogLevel;
1010
import com.fasterxml.jackson.databind.ObjectMapper;
1111
import com.fasterxml.jackson.databind.cfg.MapperBuilder;
1212
import com.fasterxml.jackson.databind.cfg.PackageVersion;
1313

14-
import java.lang.reflect.Array;
15-
1614
/**
1715
* Constructs and configures {@link ObjectMapper} instances that handle XML.
1816
*/
@@ -25,9 +23,9 @@ public final class XmlMapperFactory {
2523
private static final String TO_XML_GENERATOR = "com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator$Feature";
2624
private final ReflectiveInvoker createXmlMapperBuilder;
2725
private final ReflectiveInvoker defaultUseWrapper;
28-
private final ReflectiveInvoker enableWriteXmlDeclaration;
26+
private final ReflectiveInvoker configureWriteXmlDeclaration;
2927
private final Object writeXmlDeclaration;
30-
private final ReflectiveInvoker enableEmptyElementAsNull;
28+
private final ReflectiveInvoker configureEmptyElementAsNull;
3129
private final Object emptyElementAsNull;
3230

3331
final boolean useJackson212;
@@ -43,9 +41,9 @@ private XmlMapperFactory() {
4341

4442
ReflectiveInvoker createXmlMapperBuilder;
4543
ReflectiveInvoker defaultUseWrapper;
46-
ReflectiveInvoker enableWriteXmlDeclaration;
44+
ReflectiveInvoker configureWriteXmlDeclaration;
4745
Object writeXmlDeclaration;
48-
ReflectiveInvoker enableEmptyElementAsNull;
46+
ReflectiveInvoker configureEmptyElementAsNull;
4947
Object emptyElementAsNull;
5048
try {
5149
Class<?> xmlMapper = Class.forName(XML_MAPPER, true, thisClassLoader);
@@ -58,11 +56,11 @@ private XmlMapperFactory() {
5856
defaultUseWrapper = ReflectionUtils.getMethodInvoker(xmlMapperBuilder,
5957
xmlMapperBuilder.getDeclaredMethod("defaultUseWrapper", boolean.class), false);
6058

61-
enableWriteXmlDeclaration = ReflectionUtils.getMethodInvoker(xmlMapperBuilder,
62-
xmlMapperBuilder.getDeclaredMethod("enable", Array.newInstance(toXmlGenerator, 0).getClass()), false);
59+
configureWriteXmlDeclaration = ReflectionUtils.getMethodInvoker(xmlMapperBuilder,
60+
xmlMapperBuilder.getDeclaredMethod("configure", toXmlGenerator, boolean.class), false);
6361
writeXmlDeclaration = toXmlGenerator.getDeclaredField("WRITE_XML_DECLARATION").get(null);
64-
enableEmptyElementAsNull = ReflectionUtils.getMethodInvoker(xmlMapperBuilder,
65-
xmlMapperBuilder.getDeclaredMethod("enable", Array.newInstance(fromXmlParser, 0).getClass()), false);
62+
configureEmptyElementAsNull = ReflectionUtils.getMethodInvoker(xmlMapperBuilder,
63+
xmlMapperBuilder.getDeclaredMethod("configure", fromXmlParser, boolean.class), false);
6664
emptyElementAsNull = fromXmlParser.getDeclaredField("EMPTY_ELEMENT_AS_NULL").get(null);
6765
} catch (Throwable ex) {
6866
// Throw the Error only if it isn't a LinkageError.
@@ -79,9 +77,9 @@ private XmlMapperFactory() {
7977

8078
this.createXmlMapperBuilder = createXmlMapperBuilder;
8179
this.defaultUseWrapper = defaultUseWrapper;
82-
this.enableWriteXmlDeclaration = enableWriteXmlDeclaration;
80+
this.configureWriteXmlDeclaration = configureWriteXmlDeclaration;
8381
this.writeXmlDeclaration = writeXmlDeclaration;
84-
this.enableEmptyElementAsNull = enableEmptyElementAsNull;
82+
this.configureEmptyElementAsNull = configureEmptyElementAsNull;
8583
this.emptyElementAsNull = emptyElementAsNull;
8684

8785
this.useJackson212 = PackageVersion.VERSION.getMinorVersion() >= 12;
@@ -99,13 +97,13 @@ public ObjectMapper createXmlMapper() {
9997
.initializeMapperBuilder((MapperBuilder<?, ?>) createXmlMapperBuilder.invokeStatic());
10098

10199
defaultUseWrapper.invokeWithArguments(xmlMapperBuilder, false);
102-
enableWriteXmlDeclaration.invokeWithArguments(xmlMapperBuilder, writeXmlDeclaration);
100+
configureWriteXmlDeclaration.invokeWithArguments(xmlMapperBuilder, writeXmlDeclaration, true);
103101

104102
/*
105103
* In Jackson 2.12 the default value of this feature changed from true to false.
106104
* https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.12#xml-module
107105
*/
108-
enableEmptyElementAsNull.invokeWithArguments(xmlMapperBuilder, emptyElementAsNull);
106+
configureEmptyElementAsNull.invokeWithArguments(xmlMapperBuilder, emptyElementAsNull, true);
109107

110108
xmlMapper = xmlMapperBuilder.build();
111109
} catch (Exception exception) {

0 commit comments

Comments
 (0)