我有一个 jhipster 生成的网关,我想在其中添加一个新方法到现有存储库(使用 jhipster 实体命令生成)此存储库默认扩展 R2dbcRepository。到目前为止,我已经实现了名为 findReceiptsByCompanyId() 的方法,当我尝试调用此方法时,它给了我以下错误:
java.lang.IllegalStateException: No MethodInvocation found: Check that an AOP invocation is in progress and that the ExposeInvocationInterceptor is upfront in the interceptor chain. Specifically, note that advices with order HIGHEST_PRECEDENCE will execute before ExposeInvocationInterceptor! In addition, ExposeInvocationInterceptor and ExposeInvocationInterceptor.currentInvocation() must be invoked from the same thread.
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.currentInvocation(ExposeInvocationInterceptor.java:74)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.MonoError] :
reactor.core.publisher.Mono.error(Mono.java:313)
org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$5(TransactionAspectSupport.java:951)
Error has been observed at the following site(s):
|_ Mono.error ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$5(TransactionAspectSupport.java:951)
|_ Flux.usingWhen ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$8(TransactionAspectSupport.java:944)
|_ Mono.then ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$7(TransactionAspectSupport.java:958)
|_ Flux.onErrorResume ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$8(TransactionAspectSupport.java:957)
|_ Mono.flatMapMany ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$invokeWithinTransaction$9(TransactionAspectSupport.java:940)
|_ Mono.flatMapMany ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.invokeWithinTransaction(TransactionAspectSupport.java:939)
|_ Flux.contextWrite ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.invokeWithinTransaction(TransactionAspectSupport.java:964)
|_ Flux.contextWrite ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.invokeWithinTransaction(TransactionAspectSupport.java:965)
|_ Flux.collectList ⇢ at com.nosi.gateway.web.rest.ReceiptResource.getAllReceiptsByCompanyId(ReceiptResource.java:180)
|_ Mono.map ⇢ at org.springframework.http.codec.json.AbstractJackson2Encoder.encode(AbstractJackson2Encoder.java:150)
|_ Mono.flux ⇢ at org.springframework.http.codec.json.AbstractJackson2Encoder.encode(AbstractJackson2Encoder.java:151)
|_ Flux.singleOrEmpty ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:129)
|_ Mono.switchIfEmpty ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:130)
|_ Mono.flatMap ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:134)
|_ checkpoint ⇢ Handler com.nosi.gateway.web.rest.ReceiptResource#getAllReceiptsByCompanyId(Long) [DispatcherHandler]
我该如何解决这个问题?这就是我修改的存储库的样子:
/**
* Spring Data SQL reactive repository for the Receipt entity.
*/
@SuppressWarnings("unused")
@Repository
public interface ReceiptRepository extends R2dbcRepository<Receipt, Long>, ReceiptRepositoryInternal {
@Query("SELECT * FROM receipt entity WHERE entity.user_receipt_id = :id")
Flux<Receipt> findByUser_receipt(Long id);
@Query("SELECT * FROM receipt entity WHERE entity.user_receipt_id IS NULL")
Flux<Receipt> findAllWhereUser_receiptIsNull();
// just to avoid having unambigous methods
@Override
Flux<Receipt> findAll();
@Override
Flux<Receipt> findReceiptsByCompanyId(Long id);
@Override
Mono<Receipt> findById(Long id);
@Override
<S extends Receipt> Mono<S> save(S entity);
}
interface ReceiptRepositoryInternal{
<S extends Receipt> Mono<S> insert(S entity);
<S extends Receipt> Mono<S> save(S entity);
Mono<Integer> update(Receipt entity);
Flux<Receipt> findAll();
Mono<Receipt> findById(Long id);
Flux<Receipt> findAllBy(Pageable pageable);
Flux<Receipt> findAllBy(Pageable pageable, Criteria criteria);
Flux<Receipt> findReceiptsByCompanyId(Long id);
}
我的服务类实现该方法:
@Service
@Transactional
public class ReceiptService {
private final Logger log = LoggerFactory.getLogger(ReceiptService.class);
private final ReceiptRepository receiptRepository;
private final ReceiptMapper receiptMapper;
public ReceiptService(ReceiptRepository receiptRepository, ReceiptMapper receiptMapper) {
this.receiptRepository = receiptRepository;
this.receiptMapper = receiptMapper;
}
/**
* Save a receipt.
*
* @param receiptDTO the entity to save.
* @return the persisted entity.
*/
public Mono<ReceiptDTO> save(ReceiptDTO receiptDTO) {
log.debug("Request to save Receipt : {}", receiptDTO);
return receiptRepository.save(receiptMapper.toEntity(receiptDTO)).map(receiptMapper::toDto);
}
/**
* Partially update a receipt.
*
* @param receiptDTO the entity to update partially.
* @return the persisted entity.
*/
public Mono<ReceiptDTO> partialUpdate(ReceiptDTO receiptDTO) {
log.debug("Request to partially update Receipt : {}", receiptDTO);
return receiptRepository
.findById(receiptDTO.getId())
.map(existingReceipt -> {
receiptMapper.partialUpdate(existingReceipt, receiptDTO);
return existingReceipt;
})
.flatMap(receiptRepository::save)
.map(receiptMapper::toDto);
}
public Flux<ReceiptDTO> findByCompany(Long companyUserID) {
log.debug("Request to get all Receipts by a company");
return receiptRepository.findReceiptsByCompanyId(companyUserID).map(receiptMapper::toDto);
}
}
最后是我的控制器:
@RestController
@RequestMapping("/api")
public class ReceiptResource {
private final Logger log = LoggerFactory.getLogger(ReceiptResource.class);
private static final String ENTITY_NAME = "receipt";
@Value("${jhipster.clientApp.name}")
private String applicationName;
private final ReceiptService receiptService;
private final ReceiptRepository receiptRepository;
private final UserRepository userRepository;
public ReceiptResource(ReceiptService receiptService, ReceiptRepository receiptRepository, UserRepository userRepository) {
this.receiptService = receiptService;
this.receiptRepository = receiptRepository;
this.userRepository = userRepository;
}
/**
* {@code POST /receipts} : Create a new receipt.
*
* @param receiptDTO the receiptDTO to create.
* @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new receiptDTO, or with status {@code 400 (Bad Request)} if the receipt has already an ID.
* @throws URISyntaxException if the Location URI syntax is incorrect.
*/
@PostMapping("/receipts")
public Mono<ResponseEntity<ReceiptDTO>> createReceipt(@RequestBody ReceiptDTO receiptDTO) throws URISyntaxException {
log.debug("REST request to save Receipt : {}", receiptDTO);
if (receiptDTO.getId() != null) {
throw new BadRequestAlertException("A new receipt cannot already have an ID", ENTITY_NAME, "idexists");
}
return receiptService
.save(receiptDTO)
.map(result -> {
try {
return ResponseEntity
.created(new URI("/api/receipts/" + result.getId()))
.headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
.body(result);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
});
}
@GetMapping("/receipts/byUserId")
public Mono<List<ReceiptDTO>> getAllReceiptsByCompanyId(@RequestParam Long companyId) {
log.debug("REST request to get all Receipts");
return receiptService.findByCompany(companyId).collectList();
}
}
当我在没有 @Column 注释的实体声明中的某些字段上应用注释 @Transient 时,我遇到了同样的错误,因为我没有在数据库表中创建这些额外的字段。
更改依赖关系的事件对我不起作用,如下所述: @Spring 数据中的Transient 不起作用