gpt4 book ai didi

java - 自定义 BeanPropertyFilter - 仅序列化部分字符串

转载 作者:行者123 更新时间:2023-11-30 09:01:47 24 4
gpt4 key购买 nike

我急需帮助。我目前正在对 Content API 中的资源进行一些安全限制,我需要:包括属性、截断属性(如果它们是 String.class)或从序列化对象中删除属性,基于 SecurityContext。

我使用 Jackson 作为我的 json 序列化器,并选择使用 BeanPropertyFilter 来检查每个属性是否应该被序列化。

现在删除和包含选项非常简单,无论我是否序列化 bean。

但是 truncate 选项有点糟糕。下面是我到目前为止所做的有关属性序列化的工作。

@Override
public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider provider, BeanPropertyWriter writer) throws Exception {
switch (determineFilterAction(writer)) {
case INCLUDE_UNMODIFIED:
writer.serializeAsField(bean, jgen, provider);
break;
case INCLUDE_TRUNCATED:
Object value = writer.get(bean);
if (!(value instanceof String)) {
throw new UnsupportedOperationException("Annotation indicates truncate on " + writer.toString() + " which is not a string, but a " + value.getClass().getSimpleName() + " and is unsupported");
}
JsonSerializer oldSerialzer= writer.getSerializer();
writer.assignSerializer(new TruncateStringJsonSerializer());
writer.serializeAsField(bean, jgen, provider);
writer.assignSerializer(oldSerialzer);
break;
case REMOVE:
// do nothing
break;
}
}

问题是,BeanPropertyWriter.assignSerializer() 方法中有一个守卫,它不允许我为该属性切换一个新的自定义序列化程序。

有什么方法可以 Hook 并修改 bean 值吗?还是我必须重写 Factories 和 BeanPropertyWriter 才能重写 assignSerializer() 方法(避免序列化程序保护)?

我不能只用一个特殊的编写器来注释我的属性,因为序列化对象不知道任何关于 SecurityContext 的信息,所以没有办法将 securityContext 注入(inject)到自定义序列化程序中。

有没有什么办法可以让这个截断选项发生(不会让它太黑)?

提前致谢。

//最好的问候,马丁。

更新

根据 StaxMan 的回答,我已将方法更新为如下所示,并且似乎有效。至少我所有的测试都正确运行。将在开发应用程序服务器上进一步测试。

@Override
public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider provider, BeanPropertyWriter writer) throws Exception {
switch (determineFilterAction(writer)) {
case INCLUDE_UNMODIFIED:
writer.serializeAsField(bean, jgen, provider);
break;
case INCLUDE_TRUNCATED:
Object value = writer.get(bean);
if (!(value instanceof String)) {
throw new UnsupportedOperationException("Annotation indicates truncate on " + writer.toString() + " which is not a string, but a " + value.getClass().getSimpleName() + " and is unsupported");
}
String valueString = (String) value;
jgen.writeFieldName(writer.getName());
jgen.writeString(StringUtils.abbreviate(valueString, MAX_LENGTH));
break;
case REMOVE:
// do nothing
break;
}
}

最佳答案

不,甚至不要尝试调用 assignSerializer:这在多线程环境中是个坏主意——该序列化程序只有一个实例,即使您可以调用它,在同时进行两个序列化的情况下,这只会导致您出现奇怪的异常。

但也许你应该考虑从不同的方向来解决这个问题:既然你已经找到了 String 值,为什么不直接使用 JsonGenerator 写入截断值?或者,如果您愿意,可以委托(delegate)给执行写入操作的人员;但由于您正在调用它,因此它不必是 JsonSerializer 或任何东西。

关于java - 自定义 BeanPropertyFilter - 仅序列化部分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26250755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com