简体   繁体   English

无法调用方法,因为注入是 null

[英]Cannot invoke method because inject is null

I'm creating web application and i'm using java ee 7, deploying it using maven tomcat plugin creating war.我正在创建 web 应用程序,我正在使用 java ee 7,使用 mavenAA8359D845065 插件部署它。 I have servlets, ejb, some logic, jpa integration and etc. I use command pattern to process requests.我有 servlets、ejb、一些逻辑、jpa 集成等。我使用命令模式来处理请求。 My main servlet fetches parameters and redirects user to the next page according on command from hidden input as a parameter.我的主 servlet 获取参数并根据来自隐藏输入的命令作为参数将用户重定向到下一页。

I have sign in form and classes that realize login logic.我有实现登录逻辑的登录表单和类。 These classes are next这些课程是下一个

EDIT (I edited my code adding injection of beans. Also i created according qualifiers for every command)编辑(我编辑了添加 bean 注入的代码。我还为每个命令创建了相应的限定符)

My code我的代码

SigninCommand.java登录Command.java

@SigninCommandQualifier
public class SigninCommand implements Command {

    @Inject
    private UserEJB userEJB;

    public String execute(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String password = request.getParameter("password");
        String email = request.getParameter("email");
        User signinUser = new User(email, password);
        User foundUser = userEJB.findUser(signinUser);
        if (foundUser != null) {
            request.setAttribute("passedAuth", true);
            return PagesManager.getProperty("page.nameGeneration");
        } else {
            request.setAttribute("passedAuth", false);
            return PagesManager.getProperty("page.signin");
        }
    }
}

UserEJB.java用户EJB.java

@Stateless
public class UserEJB implements UserEJBRemote{
    @Inject
    private EntityManager em;
    public List<User> findUsers() {
        TypedQuery<User> query = em.createNamedQuery(FIND_ALL, User.class);
        return query.getResultList();
    }

    public User findUser(@NotNull User user) {
        return em.find(User.class, user);
    }

    public
    @NotNull
    User createUser(@NotNull User user) {
        em.persist(user);
        return user;
    }

    public
    @NotNull
    User updateUser(@NotNull User user) {
        return em.merge(user);
    }

    public void deleteUser(@NotNull User user) {
        em.remove(em.merge(user));
    }
}

beans.xml豆子.xml

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.1" bean-discovery-mode="all">
</beans>

ProjectServlet.java ProjectServlet.java

public class ProjectServlet extends HttpServlet {

    @Inject
    @EmptyCommandQualifier
    private Command command;

    @Inject
    private ActionFactory actionFactory;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        String action = request.getParameter("command");
        try {
            command = actionFactory.defineCommand(action);
        } catch (IllegalArgumentException e) {
            request.setAttribute("msg", action + " " + MessageManager.getProperty("message.wrongaction"));
        }
        String page;
        try {
            page = command.execute(request, response);
        } catch (IOException e) {
            page = PagesManager.getProperty("page.error");
        }
        if (page != null) {
            if (page.equals("not redirecting")) {
                return;
            }
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);
            dispatcher.forward(request, response);
        } else {
            page = PagesManager.getProperty("page.index");
            request.getSession().setAttribute("nullPage",
                    MessageManager.getProperty("message.nullpage"));
            response.sendRedirect(request.getContextPath() + page);
        }
    }
}

Command.java命令.java

public interface Command {
    String execute(HttpServletRequest request, HttpServletResponse response) throws IOException;
}

CommandEnum.java CommandEnum.java

public enum CommandEnum {

    EMPTY_COMMAND {
        {
            this.command = emptyCommand;
        }
    },
    NAME_GENERATION {
        {
            this.command = nameGenerationCommand;
        }
    },
    NAME_GENERATION_SETTINGS {
        {
            this.command = nameGenerationSettingsCommand;
        }
    },
    SIGNIN {
        {
            this.command = signinCommand;
        }
    };

    Command command;

    @Inject
    EmptyCommand emptyCommand;
    @Inject
    NameGenerationCommand nameGenerationCommand;
    @Inject
    NameGenerationSettingsCommand nameGenerationSettingsCommand;
    @Inject
    SigninCommand signinCommand;

    public Command getCommand() {
        return command;
    }
}

ActionFactory.java ActionFactory.java

public class ActionFactory {

    @Inject
    @EmptyCommandQualifier
    private Command command;

    @Inject
    private CommandEnum commandEnum;

    public Command defineCommand(String action) throws IllegalArgumentException {
        if (action == null || action.isEmpty()) {
            return command;
        }
        commandEnum = CommandEnum.valueOf(action.toUpperCase());
        command = commandEnum.getCommand();
        return command;
    }

    @Produces
    public static CommandEnum getEmptyCommandEnum()
    {
        return CommandEnum.EMPTY_COMMAND;
    }
}

The problem问题

When i click sign in button on login page i catch next exception:当我单击登录页面上的登录按钮时,我捕获下一个异常:

java.lang.NullPointerException: Cannot invoke "factory.ActionFactory.defineCommand(String)" because "this.actionFacto
ry" is null
        at servlet.ProjectServlet.processRequest(ProjectServlet.java:39)
        at servlet.ProjectServlet.doPost(ProjectServlet.java:33)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
        at java.base/java.lang.Thread.run(Thread.java:832)
        at org.apache.coyote.http11.AbstractHttp11Proces
sor.process(AbstractHttp11Processor.java:1041)
        at org.apache.coyote.AbstractProtocol$AbstractCo
nnectionHandler.process(AbstractProtocol.java:603)
        at org.apache.tomcat.util.net.JIoEndpoint$Socket
Processor.run(JIoEndpoint.java:310)
        at java.base/java.util.concurrent.ThreadPoolExec
utor.runWorker(ThreadPoolExecutor.java:1130)
        at java.base/java.util.concurrent.ThreadPoolExec
utor$Worker.run(ThreadPoolExecutor.java:630)
        at java.base/java.lang.Thread.run(Thread.java:83
2)

actionFactory is null and i don't know why. actionFactory 是 null 我不知道为什么。

What i've tried我试过的

  1. Adding @Stateless annotation to SigninCommand@Stateless添加SigninCommand注解
  2. Adding bean.xml file to WEB-INF folder (before it was placed at META-INF)将 bean.xml 文件添加到 WEB-INF 文件夹(在它被放置在 META-INF 之前)
  3. Clear IDEA cache清除 IDEA 缓存
  4. Attach @Named annotation to UserEJB class@Named注释附加到UserEJB class

But i still get NPE.但我仍然得到NPE。

Help, please.请帮忙。

The Problem was, besides the usage of new for CDI-beans, that tomcat was used as container without any additions like Weld-Standalone.问题是,除了 CDI bean 使用 new 之外,tomcat 被用作容器,没有像 Weld-Standalone 这样的任何添加。 Therefore neither Ejb-Annotations like @Ejb, @Standalone,... nor CDI-Annotations like @Inject had any effect during deployment of the war-file.因此,@Ejb、@Standalone 等 Ejb 注释和 @Inject 等 CDI 注释在部署战争文件期间都没有任何影响。 The reasonable solution for that is to switch from a pure servlet-container to a microprofile-container like wildfly, kumuluzee...合理的解决方案是从纯 servlet-container 切换到 microprofile-container,如 wildfly、kumuluzee...

This is usually caused by some occurrence of instantiation by new somewhere in your call hierarchy.这通常是由调用层次结构中某处的 new 实例化引起的。 Make sure that any instance of your SigninCommand class is not being instantiated by new .确保您的SigninCommand class 的任何实例都没有被new实例化。 Since we do not have your main servlet code, I apologize that is just a guess as I can't leave a comment asking to include your servlet code.由于我们没有您的主要 servlet 代码,我很抱歉这只是一个猜测,因为我无法发表评论要求包含您的 servlet 代码。 Cheers.干杯。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM