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

@JsonIgnore和@JsonBackReference将被忽略

松英喆
2023-03-14

我正在使用RestEasy、Jboss 7和EJB 3.1。我正在创建一个以JSON格式返回数据的RESTful Web服务。

问题是我在一个实体上有一个@ManyToOne关系,这会在序列化期间导致无限递归。我尝试使用Jackson的@JsonIgnore@JsonBackReferenceannotation来解决这个问题,但似乎它们被完全忽略了,无限递归仍在发生。

这是我的用户类:

class User {
    private String userId;
    private Role role;

    @Id
    @Column(name = "\"UserId\"", unique = true, nullable = false, length = 30)
    public String getUserId() {
        return this.UserId;
    }

    public void setUserId(String UserId) {
        this.UserId = UserId;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "\"RoleId\"", nullable = false)
    //I have tried @JsonIgnore without @JsonBackReference 
    @JsonIgnore
    //I have tried @JsonBackReference without @JsonIgnore 
    //Also I have tried @JsonBackReference and @JsonIgnore together
    @JsonBackReference("role-User")
    public Role getRole() {
        return this.role;
    }
}

这是我角色课的一部分:

@JsonManagedReference("role-User")
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "role")
public Set<User> getUsers() {
    return this.users;
}

我在某处读到过,我应该用我的应用程序注册Jackson,以便能够使用常规的Jaxb注释,所以我创建了一个类

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {
    public JacksonContextResolver() {
        ObjectMapper mapper = new ObjectMapper();
        AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();

        mapper.getDeserializationConfig().setAnnotationIntrospector(
                introspector);
        mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
    }

    public ObjectMapper getContext(Class<?> objectType) {
        return objectMapper;
    }
}

上面的问题是JaxbAnnotationNeveSpector()已弃用。

请:

    < li >您知道为什么杰克逊的注释会被忽略吗? < li >如何使用常规的JAXB XML注释而不是Jackson的注释? < li >我可以用什么来代替< code > JaxbAnnotationIntrospector()?

任何这些问题的答案都是值得赞赏的,谢谢。

更新:

现在,我已经排除了使用jboss部署结构的reseasy-jackson-提供者.xml而我使用的是抛弃。我仍然想知道我怎么能使用杰克逊!

共有3个答案

黎征
2023-03-14

我遇到了这个问题,并通过将我的构建(pom.xml)中的杰克逊库版本从1.8.x更新到1.9.13来使用相同的代码。如果您使用的是 maven,请编辑您的 pom.xml以包含:

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

文档没有帮助,但1.8.x版本似乎不支持对Sets的反向引用。

云建木
2023-03-14

使用 import com.fasterxml.jackson.annotation.JsonBackReference; 而不是导入组织.codehaus.jackson.annotate.JsonBackReference;.

这是我的问题。

朱岳
2023-03-14

这里的问题好像和使用Set有关

 类似资料:
  • 我知道和,都是用来解决的,这两个有什么区别? 注意:这些是杰克逊的注释。

  • 我使用的是spring 4.0.1,hibernate 4.3.5,jackson 1.9.2和STS IDE我正在创建一个RESTful Web服务,当我使用Hibernate代码生成器时,它以JSON格式返回数据,它生成由注释的关联实体的getter和setter,用于源,用于引用,这会导致无限递归序列化。我尝试使用Jackson的@JsonIgnore和@JsonBackReference注

  • 问题内容: 有没有一种方法可以基于Cython扩展中嵌入的循环来中断()Python脚本? 我有以下python脚本: 这会运行一个循环,该循环是C ++ Cython扩展的一部分。然后,在按的同时,将引发,但将其忽略,并且程序将继续进行直到模拟结束。 我发现的解决方法是通过捕获信号来处理扩展中的异常: 然后 : 我不能通过Python或至少从Cython进行这项工作吗?当我要在Windows /

  • 问题内容: 我想知道的区别,并在杰克逊? 问题答案: @JsonManagedReference是引用的前一部分-可以正常序列化的部分。@JsonBackReference是参考的后半部分–序列化将忽略它。 所以他们真的取决于你的关系方向

  • 我想知道Jackson中和之间的区别?

  • 我的文件似乎被Git忽略了-文件是否已损坏?Git期望哪种文件格式、区域设置或区域性? 我的: 的输出: 我希望和不出现在“未跟踪文件”列表中。 我应该从哪里开始寻找解决这个问题?