从Intellij切换到Maven build时Java的空指针异常
我在使用Intellij构建时使用了一些代码。我切换到Maven是因为我想要一个易于执行的jar文件,但现在服务的行为方式不同了 我希望能做到从Intellij切换到Maven build时Java的空指针异常,java,maven,jersey,grizzly,java-ws,Java,Maven,Jersey,Grizzly,Java Ws,我在使用Intellij构建时使用了一些代码。我切换到Maven是因为我想要一个易于执行的jar文件,但现在服务的行为方式不同了 我希望能做到 curl-X POSThttp://localhost:8080/api/values --数据“value=10”并在此处接收: @Path("api/values") public class Receive { @EJB Tracker tracker; @POST @Consumes(MediaType.APPL
curl-X POSThttp://localhost:8080/api/values --数据“value=10”
并在此处接收:
@Path("api/values")
public class Receive {
@EJB
Tracker tracker;
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public Response doPost(@FormParam("value") int val) {
Logger l = Logger.getLogger("org.glassfish.grizzly.http.server.HttpHandler");
l.setLevel(Level.FINE);
l.setUseParentHandlers(false);
ConsoleHandler ch = new ConsoleHandler();
ch.setLevel(Level.ALL);
l.addHandler(ch);
l.log(Level.FINE, val);
tracker.increaseSum(10);
return Response.status(200).entity("ok").build();
}
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return "Got it!";
}
但我现在得到一个空指针异常:
Apr 30, 2017 5:35:07 PM org.glassfish.grizzly.http.server.HttpHandler$1 run
FINE: service exception
java.lang.NullPointerException
at com.underdog.jersey.grizzly.Receive.doPost(Receive.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:164)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:181)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:158)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:101)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:305)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:288)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1110)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:381)
at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:219)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:748)
我的pom中是否缺少依赖项?简单的@GET
方法似乎运行良好
编辑:所做的更改:
@Path("/api/values")
public class Receive {
@Inject
public Tracker tracker;
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public String doPost(@FormParam("value") int val) {
this.tracker.increaseSum(val);
return "\nok\n";
}
// Tell the tracker to set sum == 0, effectively "erasing" the "stored"
// values.
@DELETE
@Produces(MediaType.TEXT_PLAIN)
public Response deleteSum() {
this.tracker.clearSum();
return Response.status(200).entity("\nok\n").build();
}
}
@Path("/api/sum/values")
public class Send {
@Inject
public Tracker tracker;
@GET
@Produces("text/plain")
function
}
@Immediate
public class Tracker {
...
@PostConstruct
function
@PreDestroy
function
@Lock(LockType.READ)
function
}
//Defines the base URI for all resource URIs.
@ApplicationPath("/api")
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages(true, "com.underdog.jersey.grizzly");
register(new AbstractBinder() {
@Override
protected void configure() {
bind(Tracker.class)
.to(Tracker.class)
.in(Immediate.class);
}
});
}
}
mvn清洁包后出现错误
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project jersey-grizzly: Compilation failure: Compilation failure:
[ERROR] /home/user/kochava/simple-service/src/main/java/com/underdog/jersey/grizzly/Tracker.java:[18,7] error: duplicate class: Tracker
[ERROR] /home/user/kochava/simple-service/src/main/java/com/underdog/jersey/grizzly/Send.java:[16,11] error: cannot access Tracker
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
如果您没有运行EE容器,那么EJB将无法工作。您应该去掉项目中的任何EE依赖项,这样您就不会试图使用任何不起作用的东西
相反,您应该只使用Jersey内部DI系统HK2来处理服务注入。tracker为
null
。我想它需要以某种方式被实例化。所以我试着浏览那个文档。我创建了一个扩展ResourceConfig
的类,注册了一个AbstractBinder
,通过将Tracker
绑定到Immediate
中的Tracker
(因为Tracker在服务启动和销毁时需要做一些事情)并将@Singleton
替换为@Immediate
作为类的注释。我有两个类试图@注入跟踪器。现在编译错误是,Tracker
是一个重复的类,Send
,另一个类访问它,不能访问它。还有其他建议吗?是的。将您所做的作为编辑发布到您的帖子中,并发布完整的错误。没有它我就无能为力。“你说的对米尔赖特来说没有多大意义,”编辑说。让我知道如果这更有意义,我是100%新的东西。还有,谢谢你的帮助。我不知道这是什么意思。我从来没见过。这是一个编译错误,所以这是您在编码中没有正确执行的部分。不确定它是什么。您需要启用立即作用域。看见