gpt4 book ai didi

Java:带有 Vaadin 11 框架的 Jetty 服务器

转载 作者:行者123 更新时间:2023-12-01 19:46:53 26 4
gpt4 key购买 nike

我的目标是配置 Jetty 服务器以与 Vaadin 11 框架配合使用。
我正在尝试的是以下内容:

public static void main(final String[] args) {
final Server server = new Server();
final ServerConnector httpConnector = new ServerConnector(server);
httpConnector.setPort(8080);
final ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
contextHandler.setContextPath("/");
final ServletHolder servletHolder = new ServletHolder(new VaadinServlet());
contextHandler.addServlet(servletHolder, "/*");
final WebAppContext context = new WebAppContext();
context.setServer(server);
context.setContextPath("/");
context.setClassLoader(Thread.currentThread().getContextClassLoader());
server.addConnector(httpConnector);
server.setHandler(contextHandler);
server.setHandler(context);

try {
server.start();
} catch (final Exception e) {
e.printStackTrace();
}
}


@Route("/")
public class MainView extends Div {
public MainView() {
System.out.println("main");
setText("aha bye");
}
}

但是 MainView 从未被调用。我如何告诉 Jetty 将请求转发给 Vaadin?

最佳答案

在这里回答我自己的问题。

But this will still not work as you expect. Why? Because you have 2 different contexts (contextHandler and context) on the same contextPath /.

But again, this seems backwards, as your WebAppContext has no resource base or war declared, so it's not doing anything for you in your sample code.

Joakim Erdfelt是绝对正确的。我用两个上下文弄乱了代码并且我必须设置资源库或 war 文件。非常感谢您指出解决方案的方法!

感谢Leif Åstrand还有查找带有 @Route 注释的所有类的提示!

我将服务器代码与“客户端”代码分开,并为 jetty 服务器构建了 war 文件。

我使用的工作解决方案如下:

final WebAppContext context = new WebAppContext();
context.setServer(httpServer);
context.setContextPath("/");
context.addServlet(new ServletHolder(new TestServlet()), "/*");
context.setWar(warFile.getAbsolutePath());
context.setExtractWAR(true);
context.setClassLoader(Thread.currentThread().getContextClassLoader());
context.setInitParameter("ui", MainUI.class.getCanonicalName());
httpServer.setHandler(context);

Testservlet(扩展VaadinServlet)中,我有以下两种方法:

@SuppressWarnings("unchecked")
private void findRouteClasses() {
final Set<Class<?>> routeClasses = ReflectionUtils.findClassesWithAnnotation(Route.class,
"com.example.myproject");

this.routeClasses = new HashSet<>();

for (final Class<?> clazz : routeClasses)
this.routeClasses.add((Class<? extends Component>) clazz);
}

@Override
protected void servletInitialized() throws ServletException {
final ServletContext context = getServletContext();
final Object routeRegistryObject = context.getAttribute(RouteRegistry.class.getName());

if (routeRegistryObject == null)
throw new ServletException("routeRegistryObject is null");

if ((routeRegistryObject instanceof RouteRegistry) == false)
throw new ServletException("routeRegistryObject is not of type RouteRegistry");

final RouteRegistry routeRegistry = (RouteRegistry) routeRegistryObject;
findRouteClasses();

try {
routeRegistry.setNavigationTargets(routeClasses);
} catch (final InvalidRouteConfigurationException e) {
throw new ServletException(e);
}

super.servletInitialized();
}

搜索带有注释com.vaadin.flow.router.Route的所有类,然后将其设置为导航目标。

关于Java:带有 Vaadin 11 框架的 Jetty 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52895759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com