繁体   English   中英

Spring 引导 Jackson ResponseEntity 未找到 class 的序列化程序

[英]Spring Boot Jackson ResponseEntity No serializer found for class

我有一个 spring 引导 controller 的奇怪错误,没有返回最近创建的 object。

我有一个 controller,有 2 种方法(见下文)。 只需检索 class“OrderPay”的 Object 并将其作为响应实体的有效负载返回。 这工作正常,因此 object 没问题。

另一个创建并保留“OrderPay”的新实例,然后应该返回新创建的 object。新 object 的创建及其持久性工作正常。 但是,当我尝试退回它时,我收到以下错误消息。

现在,如果它一直出现,我就会理解该错误消息。 但是,当使用第一个 function(“getPaymentByIdTest”)返回这个新创建的 object 时,它会毫无问题地返回它,即使我以完全相同的方式从数据库中检索它并以相同的方式返回它,具有相同的返回类型的方法。

现在我知道在 HTTP-GET 方法中执行代码并不是最好的做法,但是它对于测试来说更快更方便。

谁能看到我需要调整代码的地方?

2020-04-13 21:37:57.507 错误 26796 --- [nio-8081-exec-2] oac.c.C.[.[.[/].[dispatcherServlet]:Servlet.service() for servlet [dispatcherServlet]在路径 [] 的上下文中抛出异常 [请求处理失败; 嵌套异常是 org.springframework.http.converter.HttpMessageConversionException:类型定义错误:[简单类型,class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; 嵌套的异常是 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:没有找到 class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor 的序列化程序(以避免创建 BeanSerialization_EMFYANFeature 异常)参考链:com.brownbag_api.model.OrderPay["posSend"]->com.brownbag_api.model.Pos$HibernateProxy$7l7MDMEi["hibernateLazyInitializer"])] 具有根本原因

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:没有找到用于 class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor 的序列化器,并且没有发现用于创建 BeanSerializer 的属性(以避免异常,禁用 exception_EM_PTAIL 链) com.brownbag_api.model.OrderPay["posSend"]->com.brownbag_api.model.Pos$HibernateProxy$7l7MDMEi["hibernateLazyInitializer"])

  1. Controller
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api/pay")
public class PaymentController {

    @Autowired
    private OrderPayRepo orderPayRepo;

    @Autowired
    private OrderPaySvc orderPaySvc;

    @GetMapping("/{id}")
    public ResponseEntity<?> getPaymentByIdTest(@PathVariable Long id) {
        Optional<OrderPay> orderPay = orderPayRepo.findById(id);
        return ResponseEntity.ok(orderPay);
    }

    @GetMapping("/exec/from/{from}/to/{to}/amount/{amount}")
    public ResponseEntity<?> execPayment(@PathVariable Long from, @PathVariable Long to, @PathVariable double amount) {
        Pos posFrom = posRepo.getOne(from);
        Pos posTo = posRepo.getOne(to);
        OrderPay pay = orderPaySvc.createPay(amount, posFrom, posTo);
        pay = orderPaySvc.execPay(pay);

        if (pay == null) {
            return ResponseEntity.ok("Payment could not be executed. Please see log for more details!");
        } else {
            System.err.println("Payment executed: " + pay.getPosRcv().getParty().getName());
            Long payId = pay.getId();
            System.err.println("Payment executed: " + payId);
            // payId returns the expected value here, the object is therefore saved in the database (verified).
            Optional<OrderPay> orderPay = orderPayRepo.findById(payId);
            return ResponseEntity.ok(pay);
        }

    }
}
  1. 订购.java
@Entity
@Table(name = "order_base")
@Inheritance(strategy = InheritanceType.JOINED)
public class Order implements Serializable {

    private static final long serialVersionUID = -3458221490393509305L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @NotNull
    @Column(name = "QTY")
    private double qty;

    public Order() {
    }

    public Order(@NotNull double qty) {
        super();
        this.qty = qty;
    }
}
  1. 订单支付
@Entity
@Table(name = "order_pay")
public class OrderPay extends Order implements Serializable {

    private static final long serialVersionUID = 4643589803146964779L;

    @NotNull
    @OneToOne(targetEntity = Pos.class)
    @JoinColumn(name = "POS_SEND_ID")
    private Pos posSend;

    @NotNull
    @OneToOne(targetEntity = Pos.class)
    @JoinColumn(name = "POS_RCV_ID")
    private Pos posRcv;

    public OrderPay() {
        super();
    }

    public OrderPay(@NotNull double qty, @NotNull Pos posSend, @NotNull Pos posRcv) {

        super(qty);
        this.posSend = posSend;
        this.posRcv = posRcv;

    }
}
  1. 邮编java
@Entity
@Table(name = "POS")
public class Pos implements Serializable {

    private static final long serialVersionUID = 1530699992135610397L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @NotNull
    @Column(name = "QTY")
    private double qty;

    @NotNull
    @ManyToOne(targetEntity = Party.class)
    @JoinColumn(name = "PARTY_ID")
    @JsonBackReference
    private Party party;

    public Pos() {
    }

    public Pos(@NotNull double qty, @NotNull Party owner) {
        super();
        this.qty = qty;
        this.party = owner;
    }
}
  1. JSON
{
"id":7,
"qty":33000.0,
"posSend":
  {
  "id":1,
  "qty":-266010.0,
  "hibernateLazyInitializer":{}
  },
"posRcv":
  {
  "id":2,
  "qty":66000.0,
  "hibernateLazyInitializer":{}
  }
}

如果您使用的是 Spring Boot,您可以在application.properties文件中设置以下属性。 根据您的堆栈跟踪,这应该可以解决问题(请参阅:“为避免异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS”)

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM