带有 hk2 定位器的嵌入式 Jetty 上的 Jersey 未加载 ResourceConfig
Jersey on embedded Jetty with hk2 locator not loading ResourceConfig
我正在使用 Jetty 作为 Jersey 的嵌入式服务器。
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class);
jerseyServletHolder.setInitOrder(1);
jerseyServletHolder.setInitParameter(
org.glassfish.jersey.server.ServerProperties.PROVIDER_PACKAGES,
"com.my.package");
webAppContext.addServlet(jerseyServletHolder, "/rest/*");
我有一个 ResourceConfig 实现:
@ApplicationPath("/rest")
public class MyResourceConfig extends ResourceConfig {
static{
System.out.println("ResourceConfig loaded");
// this never gets calls
}
@Inject
public MyResourceConfig(ServiceLocator serviceLocator, Properties serverProps) {
packages("com.my.package");
}
}
问题是当我启动时,MyResourceConfig class 从未加载。
如果我添加:
jerseyServletHolder.setInitParameter(
ServletProperties.JAXRS_APPLICATION_CLASS,
MyResourceConfig.class.getName());
然后会加载 ResourceConfig。
为什么 MyResoureConfig 没有根据 @ApplicationPath 注释获取?
您只需要启用注释/字节码扫描。
首先将 jetty-annotations-<version>.jar
(和传递依赖项)放入您的项目中。
然后,在您的代码中,在创建 org.eclipse.jetty.server.Server
对象后,执行此操作。
Server server = new Server(8080);
// Enable parsing of jndi-related parts of web.xml and jetty-env.xml
Configuration.ClassList classlist = Configuration.ClassList
.setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
"org.eclipse.jetty.plus.webapp.EnvConfiguration",
"org.eclipse.jetty.plus.webapp.PlusConfiguration");
// Enable annotation/bytecode scanning and ServletContainerInitializer usages
classlist.addBefore(
"org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration");
WebAppContext webAppContext = createWebAppContext();
// ....
server.start();
这将启用执行字节码扫描和注释扫描所需的配置,同时启用加载在您的 webapp 中找到的任何 javax.servlet.ServletContainerInitializer
的能力,包括来自 Jersey 的关键 (org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer
)
我正在使用 Jetty 作为 Jersey 的嵌入式服务器。
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class);
jerseyServletHolder.setInitOrder(1);
jerseyServletHolder.setInitParameter(
org.glassfish.jersey.server.ServerProperties.PROVIDER_PACKAGES,
"com.my.package");
webAppContext.addServlet(jerseyServletHolder, "/rest/*");
我有一个 ResourceConfig 实现:
@ApplicationPath("/rest")
public class MyResourceConfig extends ResourceConfig {
static{
System.out.println("ResourceConfig loaded");
// this never gets calls
}
@Inject
public MyResourceConfig(ServiceLocator serviceLocator, Properties serverProps) {
packages("com.my.package");
}
}
问题是当我启动时,MyResourceConfig class 从未加载。
如果我添加:
jerseyServletHolder.setInitParameter(
ServletProperties.JAXRS_APPLICATION_CLASS,
MyResourceConfig.class.getName());
然后会加载 ResourceConfig。
为什么 MyResoureConfig 没有根据 @ApplicationPath 注释获取?
您只需要启用注释/字节码扫描。
首先将 jetty-annotations-<version>.jar
(和传递依赖项)放入您的项目中。
然后,在您的代码中,在创建 org.eclipse.jetty.server.Server
对象后,执行此操作。
Server server = new Server(8080);
// Enable parsing of jndi-related parts of web.xml and jetty-env.xml
Configuration.ClassList classlist = Configuration.ClassList
.setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
"org.eclipse.jetty.plus.webapp.EnvConfiguration",
"org.eclipse.jetty.plus.webapp.PlusConfiguration");
// Enable annotation/bytecode scanning and ServletContainerInitializer usages
classlist.addBefore(
"org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration");
WebAppContext webAppContext = createWebAppContext();
// ....
server.start();
这将启用执行字节码扫描和注释扫描所需的配置,同时启用加载在您的 webapp 中找到的任何 javax.servlet.ServletContainerInitializer
的能力,包括来自 Jersey 的关键 (org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer
)