@@ -105,19 +105,41 @@ private JDefinedClass populateClass(
105105 JDefinedClass definedClass , Optional <JType > refType , Collection <JType > unionTypes ) {
106106 JType clazzClass = definedClass .owner ()._ref (Object .class );
107107
108- JFieldVar valueField =
109- definedClass .field (
110- JMod .PRIVATE ,
111- clazzClass ,
112- ruleFactory .getNameHelper ().getPropertyName ("value" , null ),
113- null );
108+ Optional <JFieldVar > valueField ;
109+ if (!unionTypes .isEmpty ()) {
110+ valueField =
111+ Optional .of (
112+ definedClass .field (
113+ JMod .PRIVATE ,
114+ clazzClass ,
115+ ruleFactory .getNameHelper ().getPropertyName ("value" , null ),
116+ null ));
117+
118+ definedClass ._implements (
119+ definedClass .owner ().ref (GeneratorUtils .ONE_OF_VALUE_PROVIDER_INTERFACE_NAME ));
114120
115- definedClass ._implements (
116- definedClass .owner ().ref (GeneratorUtils .ONE_OF_VALUE_PROVIDER_INTERFACE_NAME ));
121+ GeneratorUtils .implementInterface (definedClass , valueField .orElseThrow ());
117122
118- GeneratorUtils .implementInterface (definedClass , valueField );
123+ try {
124+ JDefinedClass serializer = generateSerializer (definedClass );
125+ definedClass .annotate (JsonSerialize .class ).param ("using" , serializer );
126+ } catch (JClassAlreadyExistsException ex ) {
127+ // already serialized aware
128+ }
129+
130+ try {
131+ JDefinedClass deserializer = generateDeserializer (definedClass , unionTypes );
132+ definedClass .annotate (JsonDeserialize .class ).param ("using" , deserializer );
133+ } catch (JClassAlreadyExistsException ex ) {
134+ // already deserialized aware
135+ }
136+ for (JType unionType : unionTypes ) {
137+ wrapIt (definedClass , valueField , unionType );
138+ }
139+ } else {
140+ valueField = Optional .empty ();
141+ }
119142
120- unionTypes .forEach (unionType -> wrapIt (definedClass , valueField , unionType ));
121143 refType .ifPresent (
122144 type -> {
123145 if (type instanceof JClass ) {
@@ -126,14 +148,16 @@ private JDefinedClass populateClass(
126148 wrapIt (definedClass , valueField , type );
127149 }
128150 });
151+
129152 if (definedClass .constructors ().hasNext ()
130153 && definedClass .getConstructor (new JType [0 ]) == null ) {
131154 definedClass .constructor (JMod .PUBLIC );
132155 }
133156 return definedClass ;
134157 }
135158
136- private JDefinedClass generateSerializer (JDefinedClass relatedClass ) {
159+ private JDefinedClass generateSerializer (JDefinedClass relatedClass )
160+ throws JClassAlreadyExistsException {
137161 JDefinedClass definedClass = GeneratorUtils .serializerClass (relatedClass );
138162 GeneratorUtils .fillSerializer (
139163 definedClass ,
@@ -150,7 +174,8 @@ private JDefinedClass generateSerializer(JDefinedClass relatedClass) {
150174 }
151175
152176 private JDefinedClass generateDeserializer (
153- JDefinedClass relatedClass , Collection <JType > unionTypes ) {
177+ JDefinedClass relatedClass , Collection <JType > unionTypes )
178+ throws JClassAlreadyExistsException {
154179 JDefinedClass definedClass = GeneratorUtils .deserializerClass (relatedClass );
155180 GeneratorUtils .fillDeserializer (
156181 definedClass ,
@@ -173,33 +198,28 @@ private JDefinedClass generateDeserializer(
173198
174199 private JDefinedClass createUnionClass (
175200 String nodeName , JPackage container , Optional <JType > refType , Collection <JType > unionTypes ) {
176- final String className =
177- ruleFactory .getNameHelper ().getUniqueClassName (nodeName , null , container );
178201 try {
179- JDefinedClass definedClass = container ._class (className );
180- definedClass .annotate (JsonSerialize .class ).param ("using" , generateSerializer (definedClass ));
181- definedClass
182- .annotate (JsonDeserialize .class )
183- .param ("using" , generateDeserializer (definedClass , unionTypes ));
184-
185- return populateClass (definedClass , refType , unionTypes );
202+ return populateClass (
203+ container ._class (
204+ ruleFactory .getNameHelper ().getUniqueClassName (nodeName , null , container )),
205+ refType ,
206+ unionTypes );
186207 } catch (JClassAlreadyExistsException e ) {
187208 throw new IllegalArgumentException (e );
188209 }
189210 }
190211
191- private void wrapIt (JDefinedClass definedClass , JFieldVar valueField , JType unionType ) {
212+ private void wrapIt (JDefinedClass definedClass , Optional < JFieldVar > valueField , JType unionType ) {
192213 final String name = unionType .name ();
193214 JFieldVar instanceField =
194215 definedClass .field (
195216 JMod .PRIVATE , unionType , ruleFactory .getNameHelper ().getPropertyName (name , null ));
196217 GeneratorUtils .buildMethod (definedClass , instanceField , ruleFactory .getNameHelper (), name );
197218 JMethod constructor = definedClass .constructor (JMod .PUBLIC );
198219 JVar instanceParam = constructor .param (unionType , instanceField .name ());
199- constructor
200- .body ()
201- .assign (JExpr ._this ().ref (valueField ), instanceParam )
202- .assign (JExpr ._this ().ref (instanceField ), instanceParam );
220+ JBlock body = constructor .body ();
221+ valueField .ifPresent (v -> body .assign (JExpr ._this ().ref (v ), instanceParam ));
222+ body .assign (JExpr ._this ().ref (instanceField ), instanceParam );
203223 }
204224
205225 private void unionType (
0 commit comments