Skip to content

Commit fb97a2a

Browse files
committed
Merge branch '2.21' into 2.x
2 parents b4a4e8b + 6f0a905 commit fb97a2a

5 files changed

Lines changed: 128 additions & 0 deletions

File tree

afterburner/src/main/java/com/fasterxml/jackson/module/afterburner/deser/SuperSonicBeanDeserializer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOEx
173173
public final Object deserialize(JsonParser p, DeserializationContext ctxt, Object bean)
174174
throws IOException
175175
{
176+
// [modules-base#339]: Need to delegate to base implementation for
177+
// proper @JsonView handling during deserialization
178+
if (_needViewProcesing) {
179+
return super.deserialize(p, ctxt, bean);
180+
}
176181
// [databind#631]: Assign current value, to be accessible by custom serializers
177182
p.assignCurrentValue(bean);
178183
if (_injectables != null) {
@@ -229,6 +234,11 @@ public final Object deserialize(JsonParser p, DeserializationContext ctxt, Objec
229234
@Override
230235
public final Object deserializeFromObject(JsonParser p, DeserializationContext ctxt) throws IOException
231236
{
237+
// [modules-base#339]: Need to delegate to base implementation for
238+
// proper @JsonView handling during deserialization
239+
if (_needViewProcesing) {
240+
return super.deserializeFromObject(p, ctxt);
241+
}
232242
// See BeanDeserializer.deserializeFromObject [databind#622]
233243
// Allow Object Id references to come in as JSON Objects as well...
234244
if ((_objectIdReader != null) && _objectIdReader.maySerializeAsObject()) {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.fasterxml.jackson.module.afterburner.deser;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import com.fasterxml.jackson.annotation.*;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.fasterxml.jackson.module.afterburner.AfterburnerTestBase;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
// [modules-base#339]: @JsonView deserialization filtering broken with AfterburnerModule
12+
public class DeserializeWithViewTest extends AfterburnerTestBase
13+
{
14+
static class ViewA { }
15+
static class ViewB { }
16+
17+
static class ViewBean {
18+
@JsonView(ViewA.class)
19+
public String activeField;
20+
21+
@JsonView(ViewB.class)
22+
public String ignoredField;
23+
}
24+
25+
@Test
26+
public void testReaderWithView() throws Exception
27+
{
28+
ObjectMapper mapper = newObjectMapper();
29+
String json = "{\"activeField\":\"hello\",\"ignoredField\":\"hopla\"}";
30+
31+
ViewBean bean = mapper.readerWithView(ViewA.class)
32+
.readValue(json, ViewBean.class);
33+
34+
assertEquals("hello", bean.activeField);
35+
assertNull(bean.ignoredField,
36+
"@JsonView(ViewB.class) property should not be deserialized with ViewA active");
37+
}
38+
39+
@Test
40+
public void testReaderWithoutView() throws Exception
41+
{
42+
ObjectMapper mapper = newObjectMapper();
43+
String json = "{\"activeField\":\"hello\",\"ignoredField\":\"hopla\"}";
44+
45+
// Without a view, both fields should be deserialized
46+
ViewBean bean = mapper.readValue(json, ViewBean.class);
47+
48+
assertEquals("hello", bean.activeField);
49+
assertEquals("hopla", bean.ignoredField);
50+
}
51+
}

blackbird/src/main/java/com/fasterxml/jackson/module/blackbird/deser/SuperSonicBeanDeserializer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOEx
173173
public final Object deserialize(JsonParser p, DeserializationContext ctxt, Object bean)
174174
throws IOException
175175
{
176+
// [modules-base#339]: Need to delegate to base implementation for
177+
// proper @JsonView handling during deserialization
178+
if (_needViewProcesing) {
179+
return super.deserialize(p, ctxt, bean);
180+
}
176181
// [databind#631]: Assign current value, to be accessible by custom deserializers
177182
p.assignCurrentValue(bean);
178183
if (_injectables != null) {
@@ -229,6 +234,11 @@ public final Object deserialize(JsonParser p, DeserializationContext ctxt, Objec
229234
@Override
230235
public final Object deserializeFromObject(JsonParser p, DeserializationContext ctxt) throws IOException
231236
{
237+
// [modules-base#339]: Need to delegate to base implementation for
238+
// proper @JsonView handling during deserialization
239+
if (_needViewProcesing) {
240+
return super.deserializeFromObject(p, ctxt);
241+
}
232242
// See BeanDeserializer.deserializeFromObject [databind#622]
233243
// Allow Object Id references to come in as JSON Objects as well...
234244
if ((_objectIdReader != null) && _objectIdReader.maySerializeAsObject()) {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.fasterxml.jackson.module.blackbird.deser;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import com.fasterxml.jackson.annotation.*;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.fasterxml.jackson.module.blackbird.BlackbirdTestBase;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
// [modules-base#339]: @JsonView deserialization filtering broken with BlackbirdModule
12+
public class DeserializeWithViewTest extends BlackbirdTestBase
13+
{
14+
static class ViewA { }
15+
static class ViewB { }
16+
17+
static class ViewBean {
18+
@JsonView(ViewA.class)
19+
public String activeField;
20+
21+
@JsonView(ViewB.class)
22+
public String ignoredField;
23+
}
24+
25+
@Test
26+
public void testReaderWithView() throws Exception
27+
{
28+
ObjectMapper mapper = newObjectMapper();
29+
String json = "{\"activeField\":\"hello\",\"ignoredField\":\"hopla\"}";
30+
31+
ViewBean bean = mapper.readerWithView(ViewA.class)
32+
.readValue(json, ViewBean.class);
33+
34+
assertEquals("hello", bean.activeField);
35+
assertNull(bean.ignoredField,
36+
"@JsonView(ViewB.class) property should not be deserialized with ViewA active");
37+
}
38+
39+
@Test
40+
public void testReaderWithoutView() throws Exception
41+
{
42+
ObjectMapper mapper = newObjectMapper();
43+
String json = "{\"activeField\":\"hello\",\"ignoredField\":\"hopla\"}";
44+
45+
// Without a view, both fields should be deserialized
46+
ViewBean bean = mapper.readValue(json, ViewBean.class);
47+
48+
assertEquals("hello", bean.activeField);
49+
assertEquals("hopla", bean.ignoredField);
50+
}
51+
}

release-notes/VERSION-2.x

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ Active maintainers:
2323
=== Releases ===
2424
------------------------------------------------------------------------
2525

26+
2.21.3 (not yet released)
27+
28+
#339: `@JsonView` deserialization filtering is broken when `BlackbirdModule`
29+
is registered
30+
(reported by @jolangloys)
31+
2632
2.21.2 (20-Mar-2026)
2733
2.21.1 (22-Feb-2026)
2834

0 commit comments

Comments
 (0)