tldr:是否可以在不访问互联网的情况下(使用方法的路径)发出内部请求?
-
我为什么需要它?我有一个接收很多事件的项目。由谁来决定谁将处理每个事件。所以我有类似的东西:
@RestController
@RequestMapping("/events")
public class EventHandlerAPI {
@Autowired
private EventAHandler eventAhandler;
@Autowired
private EventBHandler eventBhandler;
@PostMapping("/a")
public void handleEventA(@RequestBody EventA event) {
eventAhandler.handle(id, event);
}
@PostMapping("/b")
public void handleEventB(@RequestBody EventB event) {
eventBhandler.handle(id, event);
}
}
我们最近增加了对通过队列服务接收事件的支持。它向我们发送有效负载和事件类。我们的决定是让两个接口都正常工作(休息和排队)。避免代码重复的解决方案是让Controller选择哪个处理程序来处理事件。如今的代码与此类似:
@Configuration
public class EventHandlerQueueConsumer {
@Autowired
private EventHandlerAPI eventHandlerAPI;
private Map<Class, EventHandler> eventHandlers;
@PostConstruct
public void init() {
/* start listen queue */
declareEventHandlers();
}
private void declareEventHandlers() {
eventHandlers = new HashMap<>();
eventHandlers.put(EventAHandler.class, (EventHandler<EventAHandler>) eventHandlerAPI::handleEventA);
eventHandlers.put(EventBHandler.class, (EventHandler<EventBHandler>) eventHandlerAPI::handleEventB);
}
private void onEventReceived(AbstractEvent event) {
EventHandler eventHandler = eventHandlers.get(event.getClass());
eventHandler.handle(event);
}
private interface EventHandler<T extends AbstractEvent> {
void handle(T event);
}
}
此代码有效,但是它不允许控制器选择谁来处理事件(我们的意图)。该决定实际上是由地图决定的。
我想做的是通过请求映射来调用controller方法,而无需访问Internet。像这样:
@Configuration
public class EventHandlerQueueConsumer {
// MADE UP CLASS TO SHOW WHAT I WANT
@Autowired
private ControllerInkover controllerInvoker;
@PostConstruct
public void init() { /* start listen queue */ }
private void onEventReceived(AbstractEvent event) {
controllerInvoker.post(event.getPath(), new Object[] { event });
}
}
这种方式更清洁,并且让所有决策由控制器做出。
我研究了很多,却没有找到实现它的方法。调试spring,我发现他如何在DispatcherServlet
之后路由请求,但是所有spring内部使用HttpServletRequest
和HttpServletResponse
:(
有没有一种方法可以在不访问互联网的情况下(使用方法的路径)发出内部请求?
答案 0 :(得分:2)
它们是同一应用程序的类
那它应该足够简单。
1)您可以使用var numbers = [1, 3, 5, 10, 11];
var result = numbers.map(function(i) {
var num;
var num2;
for (i = 0; i < numbers.length - 1; i++) {
num = numbers[i];
num2 = numbers[i + 1];
return num + num2;
}
});
console.log(result);
实用工具类在UIApplication.shared.applicationIconBadgeNumber = 0
上调用自己的API。这是首选方式,因为您将遵循标准的MVC模式。像这样:
http(s)://localhost:{port}/api/{path}
2)如果您根本不想调用网络连接,则可以使用Spring的内部方法来查找映射/方法映射,也可以使用一些反射来构建自定义 在控制器启动时进行映射。然后,您可以按照模型类中显示的方式将事件/对象从地图传递给方法。像这样:
RestTemplate