Spring Boot Jackson ResponseEntity Не найден сериализатор для класса - PullRequest
0 голосов
/ 13 апреля 2020

У меня странная ошибка с контроллером весенней загрузки, не возвращающим недавно созданный объект.

У меня есть контроллер с двумя способами (см. Ниже). Один просто извлекает объект класса «OrderPay» и возвращает его в качестве полезной нагрузки объекта ответа. Это работает нормально, поэтому объект в порядке.

Другой создает и сохраняет новый экземпляр «OrderPay», а затем должен вернуть этот вновь созданный объект. Создание нового объекта и его постоянство работают нормально. Однако, когда я пытаюсь вернуть его, я получаю сообщение об ошибке ниже.

Теперь я понял бы это сообщение об ошибке, если бы оно происходило последовательно. Однако при возврате этого вновь созданного объекта с использованием первой функции («getPaymentByIdTest») он возвращает его без проблем, хотя я точно так же извлекаю его из базы данных и возвращаю таким же образом, с тем же типом возврата метода.

Теперь я знаю, что выполнение кода в методе HTTP-GET не является наилучшей практикой, однако это быстрее и удобнее для тестирования.

Может кто-нибудь увидеть, где мне нужно настроить код?

2020-04-13 21: 37: 57.507 ОШИБКА 26796 --- [nio-8081-exe c -2] oa c. c. C. [. [. [/]. [DispatcherServlet]: Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] вызвала исключение [Ошибка обработки запроса; вложенным исключением является org.springframework.http.converter.HttpMessageConversionException: ошибка определения типа: [простой тип, класс org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; вложенное исключение: com.faster xml .jackson.databind.ex c .InvalidDefinitionException: не найден сериализатор для класса org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor и не обнаружены свойства для создания BeanSerializer (чтобы избежать исключения, отключите SerializationFeature.FAIL_ON_EMPTY_BEANS) (через цепочку ссылок: com.brownbag_api.model.OrderPay ["posSend"] -> com.brownbag_api.model.Pos $ HibernateProxy $ 7l7MDMEi ["hibernate *azyInitial4454") 1015 * com.faster xml .jackson.databind.ex c .InvalidDefinitionException: не найден сериализатор для класса org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor и не обнаружено свойств для создания BeanSerializer (чтобы избежать исключения, отключите SerializationFeature .FAIL_ON_EMPTY_BEANS) (через цепочку ссылок: com.brownbag_api.model.OrderPay ["posSend"] -> com.brownbag_api.model.Pos $ HibernateProxy $ 7l7MDMEi ["hibernateLazyInitializer"])

1018
@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;
    }
}
OrderPay
@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;

    }
}
Поз. 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":{}
  }
}

1 Ответ

1 голос
/ 13 апреля 2020

Если вы используете Spring Boot, вы можете установить следующее свойство в файле application.properties . Это должно решить проблему в соответствии с вашей трассировкой стека (см .: «чтобы избежать исключений, отключите SerializationFeature.FAIL_ON_EMPTY_BEANS»)

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...