当前位置: 首页 > 知识库问答 >
问题:

Mixin 注释在作为参数传递时未得到遵守

长孙鸿
2023-03-14

我有一个第三方类特殊对象:

public class SpecialObject {
    private String name;
    private Integer id;
    private Date date;
    public String getFoo() {return "foo";} //Outlier
    public String getName() { return name;}
    public Integer getId() {return id;}
    public Date getDate() {return date;}
    public void setName(String name) {this.name = name;}
    public void setId(Integer id) {this.id = id;}
    public void setDate(Date date) {this.date = date;}
}

我希望在序列化它时只投射出名称和日期属性。使用Jackson的Mixin Annoation的魔力,我创建了一个Mixin界面:

@JsonAutoDetect(getterVisibility = Visibility.NONE)
public interface SpecialObjectMixin {
    @JsonProperty
    public String getName();
    @JsonProperty
    public Date getDate();
}

为了便于将这个SpecialObject作为参数处理,我还定义了一个SpecialObjectHandler,它实现了fromString()方法。

@Override
public SpecialObject fromString(String json) {
    try {
        return objectMapper.readValue(json, SpecialObject.class);
    } catch (IOException exception) {
        throw new IllegalArgumentException("Unable to write JSON output",
                exception);
    }
}

当反序列化程序调用此方法时,对象映射器会将错误作为

Caused by: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "foo" (Class com.kilo.SpecialObject), not marked as ignorable
 at [Source: java.io.StringReader@2d2217da; line: 1, column: 60] (through reference chain: com.kilo.SpecialObject["foo"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)
at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:673)
at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:659)
at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1365)
at org.codehaus.jackson.map.deser.BeanDeserializer._handleUnknown(BeanDeserializer.java:725)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:703)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863)
at com.kilo.SpecialObjectHandler.fromString(SpecialObjectHandler.java:34)

我的问题是,有没有一种方法可以让对象映射器(org.codehaus.jackson.map.ObjectMapper)也尊重我配置为只处理名称和日期的Mixin的注释?请随意指出一些我可能忽略的基本内容。提前感谢!

共有1个答案

黎腾
2023-03-14

这是一个配置问题。mixin 仅在序列化配置上设置,而不是在导致问题的反序列化配置上设置。在两个配置上设置它都可以解决问题。

 类似资料:
  • 这是我的映射器 我拥有的firmDBName是从我的“主数据库”中获得的。 > 如果我在第二个查询中省略了${firmDBName},则该查询试图访问我的主数据库,并抛出表“primarydb.frm_dealer_type”未找到。因此,它基本上是试图在我的主数据库中搜索一个名为“frm_dealer_type”的表。 如果我尝试重写@result null 我想要一个解决方案来将我的参数fir

  • 我正在使用注释处理来生成一些类...我有两个模块,处理器本身和使用它的“客户端”模块。我想通过客户端向处理器传递一个参数,我可以这样做 如何在处理器端检索此参数?

  • 我有如下spring数据存储库界面: Postgres的函数我定义如下(但如果我做错了,我可以更改): 调用此存储库方法时,出现以下错误: 你能告诉我在postgres函数中应该使用什么类型吗?谢谢你的建议。 编辑:我不能使用本机查询上述存储库方法并将其传递到IN子句中,因为我在DB函数中有更多的逻辑、变量等。。。它必须是DB函数。

  • 我正在开发一个OSGi应用程序(带有felix scr注释),它公开了一个服务。服务通过传递字符串值向外部api注册。 服务使用上面的一段代码来注册多个值的侦听器“SCHMA1”、“SCHMA1”、“SCHMA3”...我计划在各种捆绑包中重用此服务。但是我想只听ScheMA1的变化,而不是全部。 @参考(name="ServiceListener",策略=Reource策略。动态,基数=参考基数

  • 考虑以下代码: 我显式指定类型是因为(https://stackoverflow.com/a/40476083): 当参数包没有最后出现在参数声明中时,它是一个非推断上下文。非推断上下文意味着必须显式给出模板参数。 MSVC成功编译,而gcc和clang都拒绝代码: 现在让我们做一个小小的改变-我们从本地中删除,从而使模板参数包变为空: 这一次,三个编译器都认为代码不正确。使用http://rex

  • 问题内容: 我有3类调用,和。 在我的课程中,我想要一个这样的方法: 因此,例如,我想: 如何将类名作为参数,并基于该类名从类名创建适当的对象? 问题答案: 使用反射是可能的。这里是给定的className(作为字符串传递)。此类将在内存中搜索(应该已经加载)。 作为字符串传递时要实例化的类的名称应 完全限定