Skip to content

Commit 2f22e1f

Browse files
committed
Fix #115
1 parent d740f0e commit 2f22e1f

File tree

3 files changed

+41
-20
lines changed

3 files changed

+41
-20
lines changed

jaxb/src/main/java/com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector.java

+37-16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.fasterxml.jackson.module.jaxb;
22

3-
import java.beans.Introspector;
43
import java.lang.annotation.Annotation;
54
import java.lang.reflect.*;
65
import java.util.*;
@@ -19,7 +18,6 @@
1918
import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
2019
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
2120
import com.fasterxml.jackson.databind.type.TypeFactory;
22-
import com.fasterxml.jackson.databind.util.BeanUtil;
2321
import com.fasterxml.jackson.databind.util.ClassUtil;
2422
import com.fasterxml.jackson.databind.util.Converter;
2523
import com.fasterxml.jackson.module.jaxb.deser.DataHandlerJsonDeserializer;
@@ -307,11 +305,11 @@ public ObjectIdInfo findObjectIdInfo(Annotated ann)
307305
switch (m.getParameterCount()) {
308306
case 0: // getter
309307
idPropName = findJaxbPropertyName(m, m.getRawType(),
310-
okNameForGetter(m));
308+
_okNameForGetter(m));
311309
break method_loop;
312310
case 1: // setter
313311
idPropName = findJaxbPropertyName(m, m.getRawType(),
314-
okNameForMutator(m));
312+
_okNameForMutator(m));
315313
break method_loop;
316314
}
317315
}
@@ -451,9 +449,9 @@ public PropertyName findWrapperName(Annotated ann)
451449
AnnotatedMethod am = (AnnotatedMethod) ann;
452450
String str;
453451
if (am.getParameterCount() == 0) {
454-
str = okNameForGetter(am);
452+
str = _okNameForGetter(am);
455453
} else {
456-
str = okNameForMutator(am);
454+
str = _okNameForMutator(am);
457455
}
458456
if (str != null) {
459457
return name.withSimpleName(str);
@@ -648,7 +646,7 @@ public List<NamedType> findSubtypes(Annotated a)
648646
}
649647
}
650648
if (name == null || MARKER_FOR_DEFAULT.equals(name)) {
651-
name = Introspector.decapitalize(refType.getSimpleName());
649+
name = _decapitalize(refType.getSimpleName());
652650
}
653651
result.add(new NamedType(refType, name));
654652
}
@@ -921,7 +919,7 @@ public PropertyName findNameForSerialization(Annotated a)
921919
if (a instanceof AnnotatedMethod) {
922920
AnnotatedMethod am = (AnnotatedMethod) a;
923921
return isVisible(am)
924-
? findJaxbPropertyName(am, am.getRawType(), okNameForGetter(am))
922+
? findJaxbPropertyName(am, am.getRawType(), _okNameForGetter(am))
925923
: null;
926924
}
927925
if (a instanceof AnnotatedField) {
@@ -1118,7 +1116,7 @@ public PropertyName findNameForDeserialization(Annotated a)
11181116
return null;
11191117
}
11201118
Class<?> rawType = am.getRawParameterType(0);
1121-
return findJaxbPropertyName(am, rawType, okNameForMutator(am));
1119+
return findJaxbPropertyName(am, rawType, _okNameForMutator(am));
11221120
}
11231121
if (a instanceof AnnotatedField) {
11241122
AnnotatedField af = (AnnotatedField) a;
@@ -1333,7 +1331,7 @@ private PropertyName findJaxbPropertyName(Annotated ae, Class<?> aeType, String
13331331
return _combineNames(name, rootElement.namespace(), defaultName);
13341332
}
13351333
// Is there a namespace there to use? Probably not?
1336-
return new PropertyName(Introspector.decapitalize(aeType.getSimpleName()));
1334+
return new PropertyName(_decapitalize(aeType.getSimpleName()));
13371335
}
13381336
}
13391337
}
@@ -1577,29 +1575,29 @@ protected Class<?> _getTypeFromXmlElement(Annotated a) {
15771575
/**********************************************************
15781576
*/
15791577

1580-
protected String okNameForGetter(AnnotatedMethod am) {
1578+
protected String _okNameForGetter(AnnotatedMethod am) {
15811579
final String name = am.getName();
15821580
if (name.startsWith("is")) { // plus, must return a boolean
15831581
Class<?> rt = am.getRawType();
15841582
if (rt == Boolean.class || rt == Boolean.TYPE) {
1585-
return stdManglePropertyName(name, 2);
1583+
return _stdManglePropertyName(name, 2);
15861584
}
15871585
}
15881586
if (name.startsWith("get")) {
1589-
return stdManglePropertyName(name, 3);
1587+
return _stdManglePropertyName(name, 3);
15901588
}
15911589
return null;
15921590
}
15931591

1594-
protected String okNameForMutator(AnnotatedMethod am) {
1592+
protected String _okNameForMutator(AnnotatedMethod am) {
15951593
final String name = am.getName();
15961594
if (name.startsWith("set")) {
1597-
return stdManglePropertyName(name, 3);
1595+
return _stdManglePropertyName(name, 3);
15981596
}
15991597
return null;
16001598
}
16011599

1602-
protected String stdManglePropertyName(final String basename, final int offset)
1600+
protected String _stdManglePropertyName(final String basename, final int offset)
16031601
{
16041602
final int end = basename.length();
16051603
if (end == offset) { // empty name, nope
@@ -1625,4 +1623,27 @@ protected String stdManglePropertyName(final String basename, final int offset)
16251623
return sb.toString();
16261624
}
16271625

1626+
// 02-Nov-2020, tatu: Does not seem to be covered by any unit tests that
1627+
// fail if we simply returned "name" as-is.... ?!
1628+
// @since 2.12: to remove `java.beans.Introspector.decapitalize(...)` dependency
1629+
protected String _decapitalize(String name) {
1630+
if (name.length() > 0) {
1631+
final char firstOrig = name.charAt(0);
1632+
final char firstLC = Character.toLowerCase(firstOrig);
1633+
1634+
// Lower-case first character if not already lower-case and
1635+
// is not followed by another upper-case character
1636+
if (firstOrig != firstLC) {
1637+
if (name.length() == 1) {
1638+
return String.valueOf(firstLC);
1639+
}
1640+
if (!Character.isUpperCase(name.charAt(1))) {
1641+
char chars[] = name.toCharArray();
1642+
chars[0] = Character.toLowerCase(chars[0]);
1643+
return new String(chars);
1644+
}
1645+
}
1646+
}
1647+
return name;
1648+
}
16281649
}

jaxb/src/moditect/module-info.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
requires java.logging;
33
requires java.xml;
44
requires java.xml.bind;
5-
//
6-
// This is for `BeanIntrospector`... should do away with (only need "Introspector.decapitalize")
7-
requires java.desktop;
5+
86
// Needed for JDK9+, but optionally only
97
requires static java.activation;
108
// Jakarta Release

release-notes/VERSION-2.x

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ Modules:
1717
#85: Add Blackbird module -- alternative for Afterburner that works better with
1818
new(er) JVMs
1919
(contributed by Steven S)
20-
#100: Prevent "double-prefixing" Mr Bean generated classes
20+
#100: (mrbean) Prevent "double-prefixing" Mr Bean generated classes
21+
#115: (jaxb) Remove ` java.beans.Introspector` dependency from JAXB module (to
22+
get rid of `java.desktop` module dep)
2123
- Add Gradle Module Metadata (https://blog.gradle.org/alignment-with-gradle-module-metadata)
2224

2325
2.11.3 (02-Oct-2020)

0 commit comments

Comments
 (0)