Java Grizzly和ServletContainerContext
我试图在我编写的一个Servlet中获得一些注入的上下文(例如Session或HttpServletRequest),运行在Grizzly上,但我所做的一切似乎都不起作用。整个过程似乎过早停止,出现以下错误:Java Grizzly和ServletContainerContext,java,servlets,jersey,grizzly,Java,Servlets,Jersey,Grizzly,我试图在我编写的一个Servlet中获得一些注入的上下文(例如Session或HttpServletRequest),运行在Grizzly上,但我所做的一切似乎都不起作用。整个过程似乎过早停止,出现以下错误: SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.test.server.LolCat.hsr 服务器非常简单,它由两个文件组成,静态入口点(Main.java): 和serlv
SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.test.server.LolCat.hsr
服务器非常简单,它由两个文件组成,静态入口点(Main.java):
和serlvet(LolCat.java):
具体来说,上面源文件中的@Context行是我所有问题的来源和解决方案。我需要它,根据我读到的关于Jersey和Servlets的所有信息,它应该可以工作,但可惜它不能。我也尝试过使用GrizzlyWebContainerFactory而不是GrizzlyServerFactory,但没有效果
为供参考,项目使用以下依赖项进行编译:
- grizzly:grizzly框架:jar:2.2.21
- grizzly:grizzly http:jar:2.2.21
- grizzly:grizzly http servlet:jar:2.2.21
- grizzly:grizzly http服务器:jar:2.2.21
- 泽西岛:泽西岛服务器:jar:1.17
- jersey:jersey servlet:jar:1.17
- jersey:jersey核心:jar:1.17
- servlet:javax.servlet api:jar:2.5.0
- jersey:jersey-grizzly2:jar:1.17
- jersey:jersey-grizzly2-servlet:jar:1.17
- asm:asm:jar:3.3.1
- 这门主要课程对我来说很好:
package com.test.server;
import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import java.io.IOException;
import java.net.URI;
import javax.ws.rs.core.UriBuilder;
import com.sun.jersey.api.core.ClassNamesResourceConfig;
import com.sun.jersey.spi.container.servlet.ServletContainer;
import org.glassfish.grizzly.http.server.HttpHandler;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.http.server.Request;
import org.glassfish.grizzly.http.server.Response;
import org.glassfish.grizzly.servlet.ServletRegistration;
import org.glassfish.grizzly.servlet.WebappContext;
public class Main {
private static final String JERSEY_SERVLET_CONTEXT_PATH = "";
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost").port(8080).path("/").build();
}
public static final URI BASE_URI = getBaseURI();
public static void main(String[] args) throws IOException {
// Create HttpServer and register dummy "not found" HttpHandler
HttpServer httpServer = GrizzlyServerFactory.createHttpServer(BASE_URI, new HttpHandler() {
@Override
public void service(Request rqst, Response rspns) throws Exception {
rspns.setStatus(404, "Not found");
rspns.getWriter().write("404: not found");
}
});
// Initialize and register Jersey Servlet
WebappContext context = new WebappContext("WebappContext", JERSEY_SERVLET_CONTEXT_PATH);
ServletRegistration registration = context.addServlet("ServletContainer", ServletContainer.class);
registration.setInitParameter(ServletContainer.RESOURCE_CONFIG_CLASS,
ClassNamesResourceConfig.class.getName());
registration.setInitParameter(ClassNamesResourceConfig.PROPERTY_CLASSNAMES, LolCat.class.getName());
registration.addMapping("/*");
context.deploy(httpServer);
System.in.read();
httpServer.stop();
}
}
试试http://localhost:8080/lol/cat
在浏览器中。
您可以更改JERSEY_SERVLET_CONTEXT_PATH以更新SERVLET的上下文路径。根据开发人员的解释-Grizzly不完全符合JAX-RS 2.0,因此不会有正式的上下文注入/包装。看见 适用于Jersey+Grizzly 2.7版+ 幸运的是,有一种方法可以注入Grizzly请求/响应对象。有点棘手,但有效 Jersey的一个单元测试中提供的代码示例。看 因此,代码片段将是:
import javax.inject.Inject;
import javax.inject.Provider;
public someclass {
@Inject
private Provider<Request> grizzlyRequestProvider;
public void method() {
if (grizzlyRequestProvider != null) {
Request httpRequest = grizzlyRequestProvider.get();
// Extract what you need
}
}
}
import javax.inject.inject;
导入javax.inject.Provider;
公共课{
@注入
私人提供商grizzlyRequestProvider;
公开作废法(){
if(grizzlyRequestProvider!=null){
请求httpRequest=grizzlyRequestProvider.get();
//提取你需要的东西
}
}
}
适用于筛选器和服务方法您还可以手动注册ResourceContext
HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(getBaseURI());
WebappContext context = new WebappContext("WebappContext", "/api");
ServletRegistration registration = context.addServlet("ServletContainer",
new ServletContainer(config));
registration.addMapping("/*");
context.deploy(httpServer);
其中config是您的资源上下文 试试这样的方法:-
public class Main {
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost/").port(8080).build();
}
public static void main(String[] args) throws IOException {
ResourceConfig rc = new ResourceConfig().packages("com.example");//path to you class files
HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(getBaseURI(), rc);
System.in.read();
httpServer.stop();
}
}
它工作正常,类型安全性为明文:)。不使用String/String setInitParameter是否可以注册一个类?我认为Jersey的GrizzlyWebContainerFactory可能会得到扩展/改进,这样您就不需要处理init参数,但无论如何,它将是同一WebappContext注册代码的包装器。帮助!。。我的代码一直到
WebappContext context=new WebappContext(…
然后它突然崩溃,线程“main”java.lang.NoSuchMethodError中出现异常:org.glassfish.grizzly.utils.DataStructures.getConcurrentMap(IFI)Ljava/util/concurrent/ConcurrentMap;
。使用jersey容器grizzly http:2.5和jersey-container-grizzly2-servlet:2.5尝试了Java 7和Java 8,修复了我的问题。对于遇到此问题的任何人,我将.pom文件中的依赖项从org.glassfish.jersey.containersjersey-container-grizzly2-servlet
。更改为..org.glassfish.grizzly grizzly http servlet
…这让我毛骨悚然!!
HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(getBaseURI());
WebappContext context = new WebappContext("WebappContext", "/api");
ServletRegistration registration = context.addServlet("ServletContainer",
new ServletContainer(config));
registration.addMapping("/*");
context.deploy(httpServer);
public class Main {
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost/").port(8080).build();
}
public static void main(String[] args) throws IOException {
ResourceConfig rc = new ResourceConfig().packages("com.example");//path to you class files
HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(getBaseURI(), rc);
System.in.read();
httpServer.stop();
}
}