gpt4 book ai didi

java - Spring Boot Jackson ResponseEntity 找不到类的序列化器

转载 作者:行者123 更新时间:2023-12-02 08:44:12 25 4
gpt4 key购买 nike

我的 Spring Boot Controller 出现了一个奇怪的错误,没有返回最近创建的对象。

我有一个 Controller ,有两种方法(见下文)。只需检索“OrderPay”类的对象并将其作为响应实体的有效负载返回即可。这工作正常,因此该对象没问题。

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

现在,如果错误消息持续出现,我就能理解了。但是,当使用第一个函数(“getPaymentByIdTest”)返回这个新创建的对象时,它返回它没有问题,即使我以完全相同的方式从数据库检索它并以相同的方式返回它,具有相同的返回类型方法的说明。

现在我知道在 HTTP-GET 方法中执行代码并不是最佳实践,但它更快、更方便测试。

谁能看到我需要在哪里调整代码?

2020-04-13 21:37:57.507 ERROR 26796 --- [nio-8081-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.brownbag_api.model.OrderPay["posSend"]->com.brownbag_api.model.Pos$HibernateProxy$7l7MDMEi["hibernateLazyInitializer"])] with root cause

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: 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);
}

}
}
  • 订单.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;
    }
    }
  • 订单支付
  • @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;

    }
    }
  • Pos.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;
    }
    }
  • 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

    关于java - Spring Boot Jackson ResponseEntity 找不到类的序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61189480/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com