Исключение нулевого указателя Java RS при переключении с Intellij на сборку Maven

У меня был некоторый код, работающий при сборке с использованием Intellij. Я переключился на Maven, потому что я хотел легко исполняемый файл JAR, но теперь служба работает не так.

Я ожидаю, что смогу сделать curl -X POST http://localhost:8080/api/values --data "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)

Я скучаю по зависимости в моем пом или что-то? Простой @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 clean package

[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

1 ответ

Если вы не используете контейнер EE, EJB не будет работать. Вы должны избавиться от любых EE-зависимостей в вашем проекте, чтобы у вас не было соблазна использовать что-то, что не будет работать.

Вместо этого вы должны просто использовать внутреннюю систему DI Джерси HK2 для управления внедрением сервисов.

Другие вопросы по тегам