有没有办法动态启用/禁用杰克逊UNWRAP_ROOT_VALUE
中的WRAP_ROOT_VALUE
和ObjectMapper
。我必须启用/禁用这些属性,具体取决于调用的服务,某些请求需要JsonRootName
而有些请求不需要。我在需要它的类中有@JsonRootName
注释。我有一个自定义ObjectMapper
类,它扩展了Jackson Object映射器。我正在调用一个方法来启用/禁用属性,具体取决于调用的服务,但它似乎没有工作。
public void setWrapValue(boolean wrap) {
final AnnotationIntrospector introspector = new JacksonAnnotationIntrospector();
this.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, wrap);
this.configure(org.codehaus.jackson.map.SerializationConfig.Feature.WRAP_ROOT_VALUE, wrap);
this.setDeserializationConfig(this.getDeserializationConfig().withAnnotationIntrospector(introspector));
this.setSerializationConfig(this.getSerializationConfig().withAnnotationIntrospector(introspector));
}
答案 0 :(得分:0)
jackson-databind
上有两个问题,
3.x
。在没有Jackson的支持的情况下,除了手动将每个类包装到一个属性中之外,我看不出编写更多代码的方法。
一种方法可能是利用JAXB的功能按照类似XPath的表达式对属性进行反序列化(即foo/bar
会将属性包装在foo
下),但是Jackson不支持。
编辑:
我查看了DefaultSerializerProvider
及附近的代码。杰克逊2.9.9。
Jackson目前不区分“无属性名称”和“默认属性名称”。因此,AFAICT DefaultSerializerProvider
不知道@JsonRootName
是空还是空。
如果传播这种区别,则可以开始工作。我正在等待维护者进行判断。但是,如果不更改Jackson本身,那么从外部进行此操作将是不切实际的。
也许您可以有2个ObjectMapper
,一个有WRAP_ROOT_NAME
,一个没有@Document(collection = "${@DatabaseRepositoryCustom.getCollectionName()}")
public class A{}
,然后使用正确的一个。
但是,如果“某些请求需要它而有些则不需要”(假设使用相同的端点),那有点奇怪。还是您的意思是对于某些端点,您需要包装其他端点使用as -s的类型?然后,也许可以使用简单的组成。很难说,请添加一些JSON示例和您的模型类。