Skip to content

Commit

Permalink
fix : IgnoreGetterError not work with filters, for issue #769
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Sep 15, 2022
1 parent 4f91686 commit 5400fd0
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,16 @@ public void writeWithFilter(JSONWriter jsonWriter, Object object, Object fieldNa
continue;
}

Object fieldValue = fieldWriter.getFieldValue(object);
Object fieldValue;
try {
fieldValue = fieldWriter.getFieldValue(object);
} catch (Throwable e) {
if ((context.getFeatures() & JSONWriter.Feature.IgnoreErrorGetter.mask) != 0) {
continue;
}
throw e;
}

if (fieldValue == null && !jsonWriter.isWriteNulls()) {
continue;
}
Expand Down
55 changes: 55 additions & 0 deletions core/src/test/java/com/alibaba/fastjson2/issues/Issue769.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.alibaba.fastjson2.issues;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.filter.Filter;
import com.alibaba.fastjson2.filter.NameFilter;
import com.alibaba.fastjson2.filter.ValueFilter;
import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Issue769 {
@Test
public void testCase() {
NameFilter nameFilter = (o, s, o1) -> s;
ValueFilter localDateFormatter1 = (o, s, source) -> {
return source;
};
Filter[] defaultSerializeFilters = {nameFilter, localDateFormatter1};

JSONWriter.Feature[] serializeFeatures = {
/* 序列化enum使用name */
JSONWriter.Feature.WriteEnumsUsingName,
/* 序列化BigDecimal使用toPlainString,避免科学计数法*/
JSONWriter.Feature.WriteBigDecimalAsPlain,
/* 忽略getter方法异常 */
JSONWriter.Feature.IgnoreErrorGetter,
/*
* 基于字段序列化,如果不配置,会默认基于public的field和getter方法序列化。配置后,会基于非static的field(包括private)做反序列化。
* 注意:如果指定了filter,不配置此参数,IgnoreErrorGetter 会失效。
* */
//JSONWriter.Feature.FieldBased,
};

DataVO3 d = new DataVO3();
d.setV(null);

String json = JSON.toJSONString(d, "yyyy-MM-dd HH:mm:ss", defaultSerializeFilters, serializeFeatures);
assertEquals("{}", json);
}

static class DataVO3 {
LocalDateTime v;

public LocalDateTime getV() {
throw new RuntimeException("mock an exception");
}

public void setV(LocalDateTime v) {
this.v = v;
}
}
}

0 comments on commit 5400fd0

Please # to comment.