- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下测试设置:
public class TestingPojo {
public int getA() {
return 1;
}
@JsonView(Trimmed.class)
private String getProperty() {
return "viewproperty"; // should not be included in "default" serialization without writer view
}
}
@Test
public void testTrimmed() throws JsonProcessingException {
String result = getMapper().writerWithView(Trimmed.class).writeValueAsString(new TestingPojo());
Assert.assertFalse(result.contains("1"));
Assert.assertTrue(result.contains("viewproperty"));
}
@Test
public void testUntrimmed() throws JsonProcessingException {
String result = getMapper().writeValueAsString(new TestingPojo());
Assert.assertTrue(result.contains("1"));
Assert.assertFalse(result.contains("viewproperty")); // this should not be included as it is a private getter and @JsonView trimmed only
}
private ObjectMapper getMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.GETTER, Visibility.PUBLIC_ONLY);
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
return mapper;
}
我的“testTrimmed()”工作正常,并且输出中仅包含“viewproperty”,因为序列化是使用 Trimmed.class
View 执行的。
问题是“testUntrimmed()”无法按预期工作,因为“1”按预期包含,但“viewproperty”也包含在序列化输出中,即使我已明确设置 ObjectMapper
应该仅序列化公共(public) getter(并且 getProperty()
是私有(private)的)。问题还在于,如果我删除“testUntrimmed()”的 @JsonView
注释,则此测试将按预期工作。
这是 @JsonView
的问题吗?还是我做错了什么/我能做些什么来防止 @JsonView
带注释的 getter 在不提供作者观点?
默认 View 包含也已关闭。
我的结论:私有(private) @JsonView
带注释的 getter 包含在序列化中而不提供 View 这一事实对我来说似乎是一个明显的 jackson 错误
最佳答案
就像你说的,当你删除“testUntrimmed()”的@JsonView时,就没事了,那为什么会发生这种情况呢?如果你检查下面的源代码,那么你就会找到原因(@JsonView会使VisibilityChecker不起作用。):
//com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector#_addGetterMethod
protected void _addGetterMethod(Map<String, POJOPropertyBuilder> props,
AnnotatedMethod m, AnnotationIntrospector ai)
{
// Very first thing: skip if not returning any value
if (!m.hasReturnType()) {
return;
}
// any getter?
if (ai != null) {
if (ai.hasAnyGetterAnnotation(m)) {
if (_anyGetters == null) {
_anyGetters = new LinkedList<AnnotatedMember>();
}
_anyGetters.add(m);
return;
}
// @JsonValue?
if (ai.hasAsValueAnnotation(m)) {
if (_jsonValueGetters == null) {
_jsonValueGetters = new LinkedList<AnnotatedMethod>();
}
_jsonValueGetters.add(m);
return;
}
}
String implName; // from naming convention
boolean visible;
PropertyName pn = (ai == null) ? null : ai.findNameForSerialization(m);
boolean nameExplicit = (pn != null);
if (!nameExplicit) { // no explicit name; must consider implicit
implName = (ai == null) ? null : ai.findImplicitPropertyName(m);
if (implName == null) {
implName = BeanUtil.okNameForRegularGetter(m, m.getName(), _stdBeanNaming);
}
if (implName == null) { // if not, must skip
implName = BeanUtil.okNameForIsGetter(m, m.getName(), _stdBeanNaming);
if (implName == null) {
return;
}
visible = _visibilityChecker.isIsGetterVisible(m);
} else {
visible = _visibilityChecker.isGetterVisible(m);
}
} else { // explicit indication of inclusion, but may be empty
// we still need implicit name to link with other pieces
implName = (ai == null) ? null : ai.findImplicitPropertyName(m);
if (implName == null) {
implName = BeanUtil.okNameForGetter(m, _stdBeanNaming);
}
// if not regular getter name, use method name as is
if (implName == null) {
implName = m.getName();
}
if (pn.isEmpty()) {
// !!! TODO: use PropertyName for implicit names too
pn = _propNameFromSimple(implName);
nameExplicit = false;
}
visible = true;
}
boolean ignore = (ai == null) ? false : ai.hasIgnoreMarker(m);
_property(props, implName).addGetter(m, pn, nameExplicit, visible, ignore);
}
//com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector#findNameForSerialization
@Override
public PropertyName findNameForSerialization(Annotated a)
{
String name = null;
JsonGetter jg = _findAnnotation(a, JsonGetter.class);
if (jg != null) {
name = jg.value();
} else {
JsonProperty pann = _findAnnotation(a, JsonProperty.class);
if (pann != null) {
name = pann.value();
/* 22-Apr-2014, tatu: Should figure out a better way to do this, but
* it's actually bit tricky to do it more efficiently (meta-annotations
* add more lookups; AnnotationMap costs etc)
*/
} else if (_hasAnnotation(a, JsonSerialize.class)
|| _hasAnnotation(a, JsonView.class)
|| _hasAnnotation(a, JsonRawValue.class)
|| _hasAnnotation(a, JsonUnwrapped.class)
|| _hasAnnotation(a, JsonBackReference.class)
|| _hasAnnotation(a, JsonManagedReference.class)) {
name = "";
} else {
return null;
}
}
return PropertyName.construct(name);
}
也许你可以使用@JsonFilter来实现你的要求..只是一个建议..演示代码:
@JsonFilter("myFilter")
public class TestingPojo{
public int getA()
{
return 1;
}
@JsonView(Trimmed.class)
private String getProperty()
{
return "viewproperty"; // should not be included in "default" serialization without writer view
}
interface Trimmed {}
@Test
public void testTrimmed() throws JsonProcessingException
{
SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("myFilter",SimpleBeanPropertyFilter.serializeAll());
String result = getMapper().writer(filterProvider).withView(Trimmed.class)
.writeValueAsString(new TestingPojo());
Assert.assertFalse(result.contains("1"));
Assert.assertTrue(result.contains("viewproperty"));
}
@Test
public void testUntrimmed() throws JsonProcessingException
{
SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("myFilter",SimpleBeanPropertyFilter.serializeAllExcept("property"));
String result = getMapper().writer(filterProvider).writeValueAsString(new TestingPojo());
Assert.assertTrue(result.contains("1"));
Assert.assertFalse(result.contains("viewproperty")); // this should not be included as it is a private getter and @JsonView trimmed only
}
private ObjectMapper getMapper()
{
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(
PropertyAccessor.GETTER,
JsonAutoDetect.Visibility.PUBLIC_ONLY
);
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION,
false);
return mapper;
}
}
关于java - Jackson @JsonView 注释会干扰可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50908608/
我找不到关于 jackson 的ObjectMapper与其他映射器(例如dozer/mapStruct/modelMapping/etc)之间的区别的任何解释。所有文章都比较了dozer/mapSt
我正在使用Jackson来反序列化Kotlin数据类。我正在使用jackson-kotlin-module,但 jackson 却给我以下错误: Can not construct instance
我正在尝试将包从“com.fasterxml.jackson”重新定位到我自己的包(即“mypackage.com.fasterxml.jackson”),然后在我拥有的另一个 JAR 中使用它。 我
对于JSON对象,Subject: { "permissions":["foo", "bar"], ... } ...我想反序列化为: class Subject { priv
我正在使用 @JsonTypeInfo 和 @JsonSubTypes 来映射基于给定属性的解析子类。这是我想要解析的示例 JSON 的一个人为示例。 { "animals": [ { "
我们正在使用 dropwizard 版本 0.6.3。当我们尝试升级 0.7.0 版本时,我们在服务启动时收到此错误。 线程“main”中的异常 java.lang.VerifyError: clas
我正在尝试实现自定义解串器。因为我只想向默认反序列化器添加功能,所以我尝试在我的自定义反序列化器中存储默认反序列化器:我想使用默认反序列化 json,然后添加其他信息。 我正在尝试使用 BeanDes
我有一个这样的类(class): public class Person { private String name; public String getName(){ return
我有以下 Kotlin 数据类: data class TestObject( val boolField: Boolean, val stringField: Str
使用 Jackson 库,在 Eclipse 4.9.0 版本中出现以下错误 缺少工件 com.fasterxml.jackson.core:jackson-databind:bundle:2.9.6
我试图在我的应用程序中从azure实现keyvault,在为DefaultAzureCredentialBuilder()实现azure-identity:1.5.4 lib后,它会抛出链接错误,如下
我试图在我的应用程序中从azure实现keyvault,在为DefaultAzureCredentialBuilder()实现azure-identity:1.5.4 lib后,它会抛出链接错误,如下
我知道我们可以使用 Jackson MixIn 来重命名属性或忽略属性(参见示例 here )。但是可以添加属性吗? 添加的属性可以是: 一个常数(如版本号) 计算值(例如,如果源类具有 getWid
我有一个在 Wildfly 10 上运行的应用程序,它需要更新版本的 jackson。简单地更新 maven 依赖是行不通的。 Wildflys 自己的版本似乎干扰了... 有人有提示吗? 最佳答案
我在 Tomcat 休息应用程序中运行 Jersey 2.5.1 & Jackson。对于我最初将 POJO 简单地转换为 JSON 的用例,基本设置效果很好。集合很好地转换为 json 数组,如下所
有没有办法告诉 jackson 在序列化过程中忽略那些用非 jackson 注释注释的字段? 例如: @SomeAnnotation private String foo; 我知道有 jackson
我遇到了 jackson 序列化问题, map 中存在空值。显然,这是 Wildfly 9 使用的 Jackson 版本中的一个已知错误 ( https://issues.jboss.org/brow
给定一个像这样的 JSON 映射类: public class Person { @JsonProperty String getName() { ... } @JsonPro
如何让 Jackson 的 XMLMapper 在反序列化时读取根 xml 元素的名称? 我正在将输入 XML 反序列化为通用 Java 类、LinkedHashMap,然后反序列化为 JSON。我想
我对抽象类和 JSON 序列化和反序列化的对象引用有问题。抽象的问题如下所示: 我有一个由节点和边组成的图。每条边连接两个节点。节点可以是红色和绿色的。因此,有一个抽象类Node和两个派生类 RedN
我是一名优秀的程序员,十分优秀!