У меня есть приложение Spring Boot с использованием QueryDsl и Hibernate. Я фильтрую транзакции через API REST, который принимает несколько дополнительных параметров запроса. < /P>
@GetMapping("filter")
public ResponseData
> filterTransaction(
@RequestParam(required = false) Long appId,
@RequestParam(required = false) String orderId,
@RequestParam(required = false) Long userId,
@RequestParam(required = false) String pan,
@RequestParam(required = false) BigDecimal companyAmount,
@RequestParam(required = false) BigDecimal totalAmount,
@RequestParam(required = false) BigDecimal kbFee,
@RequestParam(required = false) BigDecimal amountFee,
@RequestParam(required = false) PaymentStatus status,
@RequestParam(required = false) @DateTimeFormat(pattern = "dd.MM.yyyy") Date from,
@RequestParam(required = false) @DateTimeFormat(pattern = "dd.MM.yyyy") Date to,
@RequestParam int pageNumber,
@RequestParam int pageSize) {
pageNumber = pageNumber > 0 ? pageNumber - 1 : 0;
Pageable pageable = PageRequest.of(pageNumber, pageSize);
return new SuccessDataResponse()
.toBuilder(SuccessMessage.SUCCESS_MESSAGE_GET_TRANSACTIONS)
.payload(transactionService.filterTransaction(appId, orderId, userId, pan, companyAmount, totalAmount, kbFee, amountFee, status, from, to, pageable))
.build();
}
public Page filterTransaction(Long appId,
String orderId,
Long userId,
String pan,
BigDecimal companyAmount,
BigDecimal totalAmount,
BigDecimal kbFee,
BigDecimal amountFee,
PaymentStatus status,
Date from,
Date to,
Pageable pageable){
log.info("Transaction is filtering...");
BooleanBuilder query = new BooleanBuilder();
QTransaction qTransaction = QTransaction.transaction;
if (nonNull(appId)){
log.info("appId:{}",appId);
query.and(qTransaction.application.id.eq(appId));
}
if (nonNull(orderId)){
log.info("orderId:{}",orderId);
query.and(qTransaction.orderId.eq(orderId));
}
if (nonNull(userId)){
log.info("userId:{}",userId);
query.and(qTransaction.user.id.eq(userId));
}
if (nonNull(pan)){
log.info("pan:{}",pan);
query.and(qTransaction.pan.containsIgnoreCase(pan));
}
if (nonNull(status)){
log.info("status:{}",status);
query.and(qTransaction.paymentStatus.eq(status));
}
if (nonNull(companyAmount)){
log.info("companyAmount:{}",status);
query.and(qTransaction.companyAmount.eq(companyAmount));
}
if (nonNull(totalAmount)){
log.info("totalAmount:{}",totalAmount);
query.and(qTransaction.amount.eq(totalAmount));
}
if (nonNull(from)){
log.info("from:{}",from);
query.and(qTransaction.createdDate.goe(from));
}
if (nonNull(to)){
log.info("to:{}",to);
query.and(qTransaction.createdDate.loe(to));
}
JPAQuery transactionJPAQuery = jpaQueryFactory
.select(qTransaction)
.from(qTransaction)
.where(query)
.orderBy(qTransaction.id.desc())
.limit(pageable.getPageSize());
List transactions = transactionJPAQuery.fetch();
List responses = transactions.stream()
.map(INSTANCE::mapToResponse)
.toList();
return new PageImpl(responses,pageable,transactions.size());
< /code>
} < /p>
Одним из полей в моей сущности является Enum PaymentStatus, и он хранится в целочисленном типе базы данных. Я не передаю это значение в запросе. < /P>
Проблема:
, когда я делаю запрос таким http: // localhost: 8888/api/transactions/filter? PageSize = 10 & PageNumber = 1 & TotalAmount = 2 & UserId = 10537
Я получаю эту ошибку:
Java.lang.arrayIndexoutOfBoundsexcept org.hibernate.type.descriptor.java.enumjavatypedescriptor.fromordinal (enumjavatypedescriptor.java:76)
...образноpublic enum PaymentStatus {
CREATED(0),
APPROVED(1),
CANCELED(2),
DECLINED(3),
REFUNDED(4),
PREAUTH_APPROVED(5),
EXPIRED(6),
REVERSE(7),
PARTIAL_REFUND(8),
PARTIAL(9),
ACCEPTED(10),
REFUND_IN_PROGRESS(11);
private int id;
PaymentStatus(int id) {
this.id = id;
}
public int getId() {
return id;
}
public static PaymentStatus of(int id) {
return Arrays.stream(PaymentStatus.values())
.filter(status -> status.id == id)
.findFirst()
.orElse(null);
}
public static PaymentStatus of(String name) {
return Arrays.stream(PaymentStatus.values())
.filter(status -> status.name().equalsIgnoreCase(name))
.findFirst()
.orElse(null);
}
public static LinkedHashSet
getSalesRadarOrder() {
return new LinkedHashSet() {
{
add(PaymentStatus.APPROVED);
add(PaymentStatus.REFUNDED);
add(PaymentStatus.DECLINED);
add(PaymentStatus.CREATED);
add(PaymentStatus.CANCELED);
}
};
}
}
< /code>
В методе FilterTransaction я преобразую строку состояния, как это: < /p>
if (status != null) {
query.and(qTransaction.paymentStatus.eq(PaymentStatus.of(status)));
}
< /code>
и отображение выполняется с помощью: < /p>
private PaymentStatus paymentStatus;
< /code>
Почему Hibernate пытается десериализировать порядковое перечисление, когда я вообще не передал его в запросе? И как я могу предотвратить ArrayIndexoutOfBoundsexception в этом случае? 0–11)
Проблема происходит только тогда, когда статус не передается в URL
Подробнее здесь: https://stackoverflow.com/questions/796 ... sexception