[英]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 注入的代码。我还为每个命令创建了相应的限定符)
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;
}
}
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 我不知道为什么。
@Stateless
annotation to SigninCommand
@Stateless
添加SigninCommand
注解@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.