如何修复 jhipster:未找到 MethodInitation:使用存储库时检查 AOP 调用是否存在

问题描述 投票:0回答:1

我有一个 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();
    }
}
java spring spring-boot repository jhipster
1个回答
0
投票

当我在没有 @Column 注释的实体声明中的某些字段上应用注释 @Transient 时,我遇到了同样的错误,因为我没有在数据库表中创建这些额外的字段。

更改依赖关系的事件对我不起作用,如下所述: @Spring 数据中的Transient 不起作用

© www.soinside.com 2019 - 2024. All rights reserved.