当前位置: 首页 > 知识库问答 >
问题:

轴突@QueryHandler与春@ExceptionHandler

丌官晨
2023-03-14

在使用标记为“春@ResponseStatus”的轴突@QueryHandler中引发的异常时遇到问题。原始异常被查询处理程序和轴突特定的轴突服务器远程处理异常抛出当Spring响应客户端时实际给出 500 的异常

仍然可以从 Axon 异常中获取一些信息,例如原始的“找不到实体”消息,但不能获取异常类型,也不能从原始异常包含的任何其他信息中获取。

Q1:有没有办法将查询处理程序中抛出的异常提升为Spring响应为404

Spring异常处理程序

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class NotFoundException extends ServiceException() {
  ...
}

轴突查询处理程序

@QueryHandler
public Application getApplicationById(ApplicationByIdQuery query) {
  return applicationRepository.findById(query.getId())
      .orElseThrow(() -> new NotFoundException(Application.class, query.getId()));
}

Spring控制

@Autowired
QueryGateway queryGateway;

@GetMapping(path = "/{applicationId}")
public CompletableFuture<Application> getApplication(@PathVariable String applicationId) {
  return queryGateway.query(new ApplicationByIdQuery(applicationId), ResponseTypes.instanceOf(Application.class));
}

实际结果json:

{
  "timestamp": "2019-02-08T08:04:03.629+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "An exception was thrown by the remote message handling component.",
  "path": "/api/applications/dff59c46-baf1-40f5-8a21-9286d1f8e36fx"
}

Q2:我的另一个问题是为什么不直接使用常规的JPA查询API,而是使用Axon的QueryHandler。投影表是常规JPA表,可以通过非常强大的Spring JPA进行查询。是因为直接查询不能确保投影数据的一致性吗?我看了很多例子,其中大多数使用直接访问(见下文),其余的不解决底层QueryHandler抛出的异常

@Autowired
ApplicationRepository applicationRepository;

public CompletableFuture<Application> getApplication(@PathVariable String applicationId) {
  return CompletableFuture.supplyAsync(() -> applicationRepository.findById(applicationId)
                .orElseThrow(() -> new NotFoundException(Application.class, applicationId)));   
}

共有1个答案

艾英范
2023-03-14

我希望我能在这方面给你一些建议。

对问题1的答复:

Axon服务器将始终将命令,事件或查询调度/处理异常包装到其他内容中。

因此,如果你想对远程查询处理异常做出有条件的反应,我认为你必须在代码中添加一个@ExceptionHandler(AxonServer远程查询处理异常.class)注释函数。Axon 服务器远程查询处理异常包含有关其包装的异常的详细信息,从而为您提供了一个句柄,以便在必要时发送特定响应。

然而,包装异常的格式目前并不理想。从Axon Framework/Server 4.1开始,计划还将包含异常中的类。这将允许您在处理异常时进行更简单、更细粒度的控制。

对问题2的答复:

使用专用查询消息和查询处理程序背后的想法是,您可以将对某些数据感兴趣的一方与提供答案的实现方式分离。

在框架中拥有专用的< code>QueryBus和< code>@QueryHandler解决方案之前,您所建议的是您拥有的唯一选项。然而,使用专用查询消息的概念允许您拥有一个完全独立的(微)服务来回答您的查询,而不需要查询发送方知道该服务位于何处。

利用Axon应用程序中的查询和查询处理程序是为您提供“位置透明性”的支柱之一。你完全可以不使用框架提供的查询逻辑,但是我个人认为这是进化微服务的一个很好的使能器。

希望这对你有所帮助!

 类似资料:
  • 我在GIT克隆了两个项目的一些示例,并得出结论,最终看起来更轻量级一点,但我认为这是由于缺乏与Axon相比的特性。 我徒劳地试图找到这两个框架之间的比较,在Stackoverflow中我也找不到任何比较。有人有什么意见吗?

  • 在我添加所有JPA依赖项之前,它工作得很好,但是在我为JPA添加之后,我得到了上面的异常 我该怎么修好它?

  • 我在启动服务时遇到端口冲突,而配置服务已经在运行。我目前用的是Spring Boot 1.2.3.RELEASE和Spring Cloud版本1.0.0.RELEASE(试过用1.0.1.RELEASE,同样问题)。 如果我在端口8888中启动配置服务器,然后尝试启动另一个服务,它会尝试在端口8888中启动,即使我已经指定了另一个端口。奇怪的是,这不会发生在Mac OS中,它确实会发生在Windo

  • 我正在进行迁移,这个特殊的库在中显示错误,而在中没有错误