Skip to content

Commit 07569c7

Browse files
committed
Merge branch '2.7'
2 parents c4ecc55 + f6fbed5 commit 07569c7

File tree

3 files changed

+75
-101
lines changed

3 files changed

+75
-101
lines changed

release-notes/VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ Project: jackson-databind
6565
#1215: Problem with type specialization for Maps with `@JsonDeserialize(as=subtype)`
6666
(reported by brentryan@github)
6767
#1279: Ensure DOM parsing defaults to not expanding external entities
68+
#1288: Type id not exposed for `JsonTypeInfo.As.EXTERNAL_PROPERTY` even when `visible` set to `true`
6869

6970
2.7.5 (11-Jun-2016)
7071

src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ protected Object deserializeWithExternalTypeId(JsonParser p,
662662
{
663663
final Class<?> activeView = _needViewProcesing ? ctxt.getActiveView() : null;
664664
final ExternalTypeHandler ext = _externalTypeIdHandler.start();
665-
665+
666666
for (JsonToken t = p.getCurrentToken(); t == JsonToken.FIELD_NAME; t = p.nextToken()) {
667667
String propName = p.getCurrentName();
668668
t = p.nextToken();

src/test/java/com/fasterxml/jackson/databind/jsontype/ext/ExternalTypeIdTest1288.java

Lines changed: 73 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,39 @@
55

66
import org.junit.Test;
77

8-
import com.fasterxml.jackson.annotation.JsonIgnore;
98
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
109
import com.fasterxml.jackson.annotation.JsonTypeInfo;
1110
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
11+
1212
import com.fasterxml.jackson.core.JsonParseException;
13-
import com.fasterxml.jackson.databind.DatabindContext;
14-
import com.fasterxml.jackson.databind.DeserializationFeature;
15-
import com.fasterxml.jackson.databind.JavaType;
16-
import com.fasterxml.jackson.databind.JsonMappingException;
17-
import com.fasterxml.jackson.databind.ObjectMapper;
18-
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
13+
14+
import com.fasterxml.jackson.databind.*;
1915
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
2016
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
2117
import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver;
22-
import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
23-
import com.fasterxml.jackson.databind.type.TypeFactory;
18+
import com.fasterxml.jackson.databind.jsontype.ext.ExternalTypeIdTest1288.ClassesWithBuilder.PaymentMean;
19+
import com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase;
2420

25-
public class ExternalTypeIdTest1288 {
21+
@SuppressWarnings("hiding")
22+
public class ExternalTypeIdTest1288 extends BaseMapTest
23+
{
2624
public static class ClassesWithoutBuilder {
2725

2826
public static class CreditCardDetails implements PaymentDetails {
2927

30-
private String cardHolderFirstName;
31-
private String cardHolderLastName;
32-
private String number;
33-
private String expiryDate;
34-
private int csc;
35-
private String address;
36-
private String zipCode;
37-
private String city;
38-
private String province;
28+
protected String cardHolderFirstName;
29+
protected String cardHolderLastName;
30+
protected String number;
31+
protected String expiryDate;
32+
protected int csc;
33+
protected String address;
34+
protected String zipCode;
35+
protected String city;
36+
protected String province;
3937

40-
private String countryCode;
38+
protected String countryCode;
4139

42-
private String description;
40+
protected String description;
4341

4442
public void setCardHolderFirstName (String cardHolderFirstName) {
4543
this.cardHolderFirstName = cardHolderFirstName;
@@ -90,9 +88,9 @@ public void setDescription (String description) {
9088

9189
public static class EncryptedCreditCardDetails implements PaymentDetails {
9290

93-
private UUID paymentInstrumentID;
91+
protected UUID paymentInstrumentID;
9492

95-
private String name;
93+
protected String name;
9694

9795
public void setPaymentInstrumentID (UUID paymentInstrumentID) {
9896
this.paymentInstrumentID = paymentInstrumentID;
@@ -137,9 +135,9 @@ public interface Builder {
137135

138136
public static class PaymentMean {
139137

140-
private FormOfPayment formOfPayment;
138+
FormOfPayment formOfPayment;
141139

142-
private PaymentDetails paymentDetails;
140+
PaymentDetails paymentDetails;
143141

144142
public void setFormOfPayment (FormOfPayment formOfPayment) {
145143
this.formOfPayment = formOfPayment;
@@ -153,12 +151,7 @@ public void setPaymentDetails (PaymentDetails paymentDetails) {
153151

154152
}
155153

156-
public static class PaymentDetailsTypeIdResolver implements TypeIdResolver {
157-
158-
@Override
159-
public void init (JavaType baseType) {
160-
}
161-
154+
public static class PaymentDetailsTypeIdResolver extends TypeIdResolverBase {
162155
@SuppressWarnings ("unchecked")
163156
@Override
164157
public String idFromValue (Object value) {
@@ -172,17 +165,12 @@ public String idFromValue (Object value) {
172165
public String idFromValueAndType (Object value, Class<?> suggestedType) {
173166
return this.idFromValue (value);
174167
}
175-
176-
@Override
177-
public String idFromBaseType () {
178-
return null;
179-
}
180-
168+
181169
@Override
182-
public JavaType typeFromId (DatabindContext context, String id) throws IOException {
183-
return TypeFactory.defaultInstance ().constructType (FormOfPayment.valueOf (id).getDetailsClass ());
170+
public JavaType typeFromId (DatabindContext context, String id) {
171+
return context.getTypeFactory().constructType(FormOfPayment.valueOf(id).getDetailsClass ());
184172
}
185-
173+
186174
@Override
187175
public String getDescForKnownTypeIds () {
188176
return "PaymentDetails";
@@ -192,7 +180,6 @@ public String getDescForKnownTypeIds () {
192180
public Id getMechanism () {
193181
return JsonTypeInfo.Id.CUSTOM;
194182
}
195-
196183
}
197184
}
198185

@@ -206,25 +193,25 @@ public static class CompanyCreditCardDetailsBuilder implements Builder {
206193
private String cardHolderLastName;
207194
private String number;
208195
private String expiryDate;
209-
private int csc;
196+
private int csc;
210197
private String address;
211198
private String zipCode;
212199
private String city;
213200
private String province;
214201
private String countryCode;
215202

216-
public CompanyCreditCardDetailsBuilder address (final String address) {
217-
this.address = address;
203+
public CompanyCreditCardDetailsBuilder address (final String a) {
204+
address = a;
218205
return this;
219206
}
220207

221208
@Override
222-
public CreditCardDetails build () {
209+
public CreditCardDetails build() {
223210
return new CreditCardDetails (this.cardHolderFirstName, this.cardHolderLastName, this.number, this.expiryDate, this.csc, this.address, this.zipCode, this.city,
224211
this.province, this.countryCode, "COMPANY CREDIT CARD");
225212
}
226213

227-
public CompanyCreditCardDetailsBuilder cardHolderFirstName (final String cardHolderFirstName) {
214+
public CompanyCreditCardDetailsBuilder cardHolderFirstName(final String cardHolderFirstName) {
228215
this.cardHolderFirstName = cardHolderFirstName;
229216
return this;
230217
}
@@ -335,31 +322,31 @@ public IndividualCreditCardDetailsBuilder number (final String number) {
335322
return this;
336323
}
337324

338-
public IndividualCreditCardDetailsBuilder province (final String province) {
339-
this.province = province;
325+
public IndividualCreditCardDetailsBuilder province (final String p) {
326+
province = p;
340327
return this;
341328
}
342329

343-
public IndividualCreditCardDetailsBuilder zipCode (final String zipCode) {
344-
this.zipCode = zipCode;
330+
public IndividualCreditCardDetailsBuilder zipCode (final String z) {
331+
zipCode = z;
345332
return this;
346333
}
347334

348335
}
349336

350-
private final String cardHolderFirstName;
351-
private final String cardHolderLastName;
352-
private final String number;
353-
private final String expiryDate;
354-
private final int csc;
355-
private final String address;
356-
private final String zipCode;
357-
private final String city;
358-
private final String province;
337+
protected final String cardHolderFirstName;
338+
protected final String cardHolderLastName;
339+
protected final String number;
340+
protected final String expiryDate;
341+
protected final int csc;
342+
protected final String address;
343+
protected final String zipCode;
344+
protected final String city;
345+
protected final String province;
359346

360-
private final String countryCode;
347+
protected final String countryCode;
361348

362-
private final String description;
349+
protected final String description;
363350

364351
public CreditCardDetails (final String cardHolderFirstName, final String cardHolderLastName, final String number, final String expiryDate, final int csc,
365352
final String address, final String zipCode, final String city, final String province, final String countryCode, final String description) {
@@ -399,13 +386,11 @@ public InstrumentedCreditCardBuilder paymentInstrumentID (final UUID paymentInst
399386
this.paymentInstrumentID = paymentInstrumentID;
400387
return this;
401388
}
402-
403389
}
404-
405-
private final UUID paymentInstrumentID;
406-
407-
private final String name;
408-
390+
391+
protected final UUID paymentInstrumentID;
392+
protected final String name;
393+
409394
private EncryptedCreditCardDetails (final UUID paymentInstrumentID, final String name) {
410395
super ();
411396
this.paymentInstrumentID = paymentInstrumentID;
@@ -472,27 +457,21 @@ public Builder paymentDetails (final PaymentDetails val) {
472457
}
473458
}
474459

475-
public static Builder create () {
476-
return new Builder ();
460+
public static Builder create() {
461+
return new Builder();
477462
}
478-
479-
private final FormOfPayment formOfPayment;
480-
481-
private final PaymentDetails paymentDetails;
482-
463+
464+
protected final FormOfPayment formOfPayment;
465+
protected final PaymentDetails paymentDetails;
466+
483467
private PaymentMean (final FormOfPayment formOfPayment, final PaymentDetails paymentDetails) {
484468
super ();
485469
this.formOfPayment = formOfPayment;
486470
this.paymentDetails = paymentDetails;
487471
}
488472
}
489473

490-
public static class PaymentDetailsTypeIdResolver implements TypeIdResolver {
491-
492-
@Override
493-
public void init (JavaType baseType) {
494-
}
495-
474+
public static class PaymentDetailsTypeIdResolver extends TypeIdResolverBase {
496475
@SuppressWarnings ("unchecked")
497476
@Override
498477
public String idFromValue (Object value) {
@@ -506,15 +485,10 @@ public String idFromValue (Object value) {
506485
public String idFromValueAndType (Object value, Class<?> suggestedType) {
507486
return this.idFromValue (value);
508487
}
509-
510-
@Override
511-
public String idFromBaseType () {
512-
return null;
513-
}
514-
488+
515489
@Override
516-
public JavaType typeFromId (DatabindContext context, String id) throws IOException {
517-
return TypeFactory.defaultInstance ().constructType (FormOfPayment.valueOf (id).getDetailsClass ());
490+
public JavaType typeFromId (DatabindContext context, String id) {
491+
return context.getTypeFactory().constructType(FormOfPayment.valueOf (id).getDetailsClass ());
518492
}
519493

520494
@Override
@@ -526,23 +500,22 @@ public String getDescForKnownTypeIds () {
526500
public Id getMechanism () {
527501
return JsonTypeInfo.Id.CUSTOM;
528502
}
529-
530503
}
531504
}
532-
533-
@Test
534-
public void tryToDeserialize () throws JsonParseException, JsonMappingException, IOException {
505+
506+
public void testVisibleExternalTypeId1288() throws Exception
507+
{
535508
// given
536509
final String asJson1 = "{\"form_of_payment\":\"INDIVIDUAL_CREDIT_CARD\", \"payment_details\":{\"card_holder_first_name\":\"John\", \"card_holder_last_name\":\"Doe\", \"number\":\"XXXXXXXXXXXXXXXX\", \"expiry_date\":\"MM/YY\","
537510
+ "\"csc\":666,\"address\":\"10 boulevard de Sebastopol\",\"zip_code\":\"75001\",\"city\":\"Paris\",\"province\":\"Ile-de-France\",\"country_code\":\"FR\",\"description\":\"John Doe personal credit card\"}}";
538511
final String asJson2 = "{\"form_of_payment\":\"INSTRUMENTED_CREDIT_CARD\",\"payment_details\":{\"payment_instrument_id\":\"00000000-0000-0000-0000-000000000000\", \"name\":\"Mr John Doe encrypted credit card\"}}";
539-
final ObjectMapper objectMapper = new ObjectMapper ().setPropertyNamingStrategy (PropertyNamingStrategy.SNAKE_CASE)
540-
.disable (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
541-
542-
// when
543-
objectMapper.readValue (asJson1, ClassesWithoutBuilder.PaymentMean.class);
544-
objectMapper.readValue (asJson2, ClassesWithBuilder.PaymentMean.class);
545-
546-
// then payment1 and paymentMean2 should be unmarshalled successfully
512+
final ObjectMapper objectMapper = new ObjectMapper ().setPropertyNamingStrategy (PropertyNamingStrategy.SNAKE_CASE);
513+
// .disable (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
514+
515+
ClassesWithoutBuilder.PaymentMean ob1 = objectMapper.readValue (asJson1, ClassesWithoutBuilder.PaymentMean.class);
516+
assertNotNull(ob1);
517+
ClassesWithBuilder.PaymentMean ob2 = objectMapper.readValue (asJson2, ClassesWithBuilder.PaymentMean.class);
518+
assertNotNull(ob2);
519+
547520
}
548521
}

0 commit comments

Comments
 (0)