【问题标题】:Spring jackson can't parse JSON ObjectSpring jackson 无法解析 JSON 对象
【发布时间】:2016-05-27 11:31:04
【问题描述】:

我有实体用户

    public class Users implements Serializable {
        private Long id;
        private String password;
        private String email;
        private Boolean enabled;
        private String name;
        private String lastname;
        private String userRole;
        private String secondName;
        private String telephone;
        private String automobile;
        private List<Claim> claims;
        private List<Orders> ordersList;
    // getters and setters
}

用户有许多索赔和订单。而我的控制器方法是这样的

  @RequestMapping(value = "get", method = GET)
    public
    @ResponseBody
    Users get() {
        return ((CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUserInfo();
    }

然后我尝试获取用户,我收到此错误 在

    com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:694)
        at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
        at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:672)
//etc

我所有的实体都实现了 Serializible 接口。 但是如果我尝试这样的事情

 @RequestMapping(value = "get", method = GET)
    public
    @ResponseBody
    Users get() {

        Users users = ((CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUserInfo();
        users.setClaims(null);
        users.setOrdersList(null);
        return users;

    }

它有效。 我得到这样的json字符串

{
  "id" : 7,
  "password" : "$2a$11$IDMDPHQNiNEs9NP282zrGe3rn8la5WL8aR.RY3IFFa8y0NJc9ubdS",
  "email" : "serendipity@mail.ru",
  "enabled" : true,
  "name" : "Alex",
  "lastname" : "Zhukov",
  "userRole" : "ROLE_USER",
  "secondName" : null,
  "telephone" : "89274455166",
  "automobile" : "MercedesW222",
  "claims" : null,
  "ordersList" : null
}

我做错了什么? 我的 pom.xml

 <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>RELEASE</version>
        </dependency>

更新 索赔和订单实体

   public class Orders implements Serializable {
        private Long id;
        private String status;
        private String address;
        private Timestamp fDate;
        private Integer sum;
        private Users users;
        private List<OrdersProducts> ordersProductsList;
//getters and setters
}
public class Claim implements Serializable {
    private Long id;
    private Timestamp fDate;
    private String reason;
    private String status;
    private String response;
    private Users user;
    private Integer sum;
    //getters and setters
    }

显然,他进入了深度递归。用户有很多索赔和订单,订单和索赔属于用户。 以此类推到无穷大。 但是话又说回来,在这种情况下,我必须将索赔和订单设置为空吗?

【问题讨论】:

  • 您能否分享您的索赔和订单实体
  • 我认为问题出在 Claim 和 Orders 对象内部
  • 你已经发布了堆栈跟踪的一部分,你能发布完整的东西,尤其是错误消息本身吗?
  • Serializable 表示使用字节码;它与 JSON 无关。杰克逊非常健壮。在组合它们之前尝试读取和写入每个对象。可能是时间戳有问题。

标签: java json spring maven jackson


【解决方案1】:

您的实体有循环引用。请看一下@JsonIdentityInfo 注释。也许下面的解决方案可以提供帮助

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class Claim implements Serializable {}

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class Orders implements Serializable {}

【讨论】:

    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多