Skip to content
This repository was archived by the owner on Oct 23, 2024. It is now read-only.

Commit b86ca3c

Browse files
committed
bug fixed for AfterFilter, fix #3217
1 parent e970545 commit b86ca3c

File tree

2 files changed

+100
-1
lines changed

2 files changed

+100
-1
lines changed

src/main/java/com/alibaba/fastjson/serializer/AfterFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ public abstract class AfterFilter implements SerializeFilter {
1111
private final static Character COMMA = Character.valueOf(',');
1212

1313
final char writeAfter(JSONSerializer serializer, Object object, char seperator) {
14+
JSONSerializer last = serializerLocal.get();
1415
serializerLocal.set(serializer);
1516
seperatorLocal.set(seperator);
1617
writeAfter(object);
17-
serializerLocal.set(null);
18+
serializerLocal.set(last);
1819
return seperatorLocal.get();
1920
}
2021

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.alibaba.json.bvt.issue_3300;
2+
3+
import com.alibaba.fastjson.JSON;
4+
import com.alibaba.fastjson.serializer.AfterFilter;
5+
import junit.framework.TestCase;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
public class Issue3217 extends TestCase {
11+
12+
public void test_for_issue() throws Exception {
13+
RefAfterFilterTest refAfterFilterTest = new RefAfterFilterTest();
14+
15+
List<Item> items = new ArrayList<Item>(2);
16+
Category category = new Category("category");
17+
items.add(new Item("item1",category));
18+
items.add(new Item("item2",category));
19+
20+
System.out.println(JSON.toJSONString(items,refAfterFilterTest));
21+
}
22+
23+
public static class RefAfterFilterTest extends AfterFilter {
24+
25+
private Category category = new Category("afterFilterCategory");
26+
27+
@Override
28+
public void writeAfter(Object object) {
29+
30+
if (object instanceof Item) {
31+
32+
this.writeKeyValue("afterFilterCategory", category);
33+
/*多加一个属性报错,原因是category是object也触发了writeAfter,当前线程变量serializer被设置为null了serializerLocal.set(null);
34+
*这两个write换个顺序就不会报错
35+
*/
36+
this.writeKeyValue("afterFilterTwo", "two");
37+
38+
}
39+
}
40+
}
41+
42+
public static class Category {
43+
44+
private String name;
45+
46+
public Category(String name){
47+
this.name = name;
48+
}
49+
50+
public String getName() {
51+
return name;
52+
}
53+
54+
public void setName(String name) {
55+
this.name = name;
56+
}
57+
}
58+
59+
public static class Item {
60+
61+
private String name;
62+
63+
private Category category;
64+
65+
private String barcode;
66+
67+
68+
public Item(String name,Category category){
69+
this.name = name;
70+
this.category = category;
71+
}
72+
73+
public String getName() {
74+
return name;
75+
}
76+
77+
public void setName(String name) {
78+
this.name = name;
79+
}
80+
81+
public Category getCategory() {
82+
return category;
83+
}
84+
85+
public void setCategory(Category category) {
86+
this.category = category;
87+
}
88+
89+
public String getBarcode() {
90+
return barcode;
91+
}
92+
93+
public void setBarcode(String barcode) {
94+
this.barcode = barcode;
95+
}
96+
97+
}
98+
}

0 commit comments

Comments
 (0)