【发布时间】:2015-07-17 05:14:16
【问题描述】:
我正在使用 Reactor 2 和 Spring 4。这是我拥有的典型代码 - Consumer 使用存储库
@Consumer
public class ApplicationService {
@Selector(value="/applications/id", type = SelectorType.URI)
@ReplyTo
public Application byApplicationId(String id) throws ApplicationNotFoundException {
Application app = appRepo.findOne(id);
if(app == null)
throw new ApplicationNotFoundException("Application `" + id + "` could not be found.");
return app;
}
}
然后我有一个控制器将请求传递给eventBus,我将请求传递到其中并返回Promise
@RestController
@RequestMapping("/applications")
public class ApplicationsController {
@RequestMapping(value = "/{id}", method = GET, produces = APPLICATION_JSON_VALUE)
public Promise<Event<Application>> byApplicationId(@PathVariable final String id) {
final Promise<Event<Application>> p = Promises.prepare(env);
eventBus.sendAndReceive("/applications/id", Event.wrap(id), p);
return p;
}
}
一切正常,但如果ApplicationService 抛出异常,Promises 值未设置,但我确实在控制台中得到以下信息:
16:46:58.003 [main] ERROR reactor.bus.EventBus - null
java.lang.reflect.UndeclaredThrowableException
at org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:302)
...
Caused by: com.metlife.harmony.exceptions.ApplicationNotFoundException: Application `2860c555-0bc4-45e6-95ea-f724ae3f4464` could not be found.
at com.metlife.harmony.services.ApplicationService.byApplicationId(ApplicationService.java:46) ~[classes/:?]
...
Caused by: reactor.core.support.Exceptions$ValueCause: Exception while signaling value: reactor.bus.Event.class : Event{id=null, headers={}, replyTo=reactor.bus.selector.Selectors$AnonymousKey@4, key=/applications/id, data=2860c555-0bc4-45e6-95ea-f724ae3f4464}
问题是:
我是否以错误的方式使用 Reactor 和
eventBus?如果是这样,正确的方法是什么也许这个功能还没有实现
【问题讨论】:
-
eventBus.sendAndReceive("/applications/id", Event.wrap(id), p);不会导致转换错误? -
@AnadiMisra 在什么时候?
-
出于好奇尝试了您的代码,我在该行得到了这个
The method sendAndReceive(Object, Event<?>, Consumer<T>) in the type EventBus is not applicable for the arguments (String, Event<Trainee>, Promise<ResponseEntity<String>>),我的 Promise 对象Promise<ResponseEntity<String>> response = Promises.prepare(env); -
发生这种情况是因为
T中的Promise<T>变量应该扩展Event。可能需要更大的上下文,但您也许可以使用原始类型Promise p = Promises.prepare(env)
标签: java spring spring-mvc reactor project-reactor