gpt4 book ai didi

java - 如何解决给出 NullPointerException 的@Inject?

转载 作者:行者123 更新时间:2023-12-01 11:12:05 25 4
gpt4 key购买 nike

我一直在寻找可能的解决方案,为什么我使用的 @Inject 对象返回 null。我查遍了 stackoverflow,还偶然发现了这个网站 Solving @Inject and Null Pointer Exception我确信我已经考虑到了这些。

我有一个 jsf 文件,sector.xhtml。我正在执行文件上传并调用fileUploadController的方法upload。然后stockUploadController 调用parse 方法,该方法调用SubSectorStockParser 的parse 方法。此方法解析上传的 csv,循环遍历每个 readline 调用。 subSectorToStockMapping[4] 是在 csv 文件中找到的子扇区值,它用于对数据库进行查询以检索 Subsector 对象。这就是问题所在----这一行---

Subsector subSector = stockUploadController.findSubsector(subSectorToStockMapping[4]);

stockUploadController 为 null,尽管它被注释为 @Inject,因此它会抛出 NullPointerException。

21:51:57,316 INFO  [stdout] (default task-20) stockUploadController:null
21:51:57,316 ERROR [stderr] (default task-20) java.lang.NullPointerException
21:51:57,317 ERROR [stderr] (default task-20) at com.traderpau.app.util.SubSectorToStockParser.parse(SubSectorToStockParser.java:45)
21:51:57,317 ERROR [stderr] (default task-20) at com.traderpau.app.controller.StockUploadController.parse(StockUploadController.java:42)
21:51:57,317 ERROR [stderr] (default task-20) at com.traderpau.app.controller.StockUploadController$Proxy$_$$_WeldClientProxy.parse(Unknown Source)
21:51:57,318 ERROR [stderr] (default task-20) at com.traderpau.app.controller.FileUploadController.upload(FileUploadController.java:84)
21:51:57,318 ERROR [stderr] (default task-20) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
21:51:57,318 ERROR [stderr] (default task-20) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
21:51:57,319 ERROR [stderr] (default task-20) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
21:51:57,319 ERROR [stderr] (default task-20) at java.lang.reflect.Method.invoke(Method.java:606)
21:51:57,319 ERROR [stderr] (default task-20) at com.sun.el.parser.AstValue.invoke(AstValue.java:292)
21:51:57,320 ERROR [stderr] (default task-20) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
21:51:57,320 ERROR [stderr] (default task-20) at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
21:51:57,320 ERROR [stderr] (default task-20) at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
21:51:57,321 ERROR [stderr] (default task-20) at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
21:51:57,321 ERROR [stderr] (default task-20) at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
21:51:57,321 ERROR [stderr] (default task-20) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
21:51:57,322 ERROR [stderr] (default task-20) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)

我已经确认使用 @Inject 的代码的其他部分正在工作。

您能否提供我可能错过的任何其他内容或我可以调查以解决此问题的任何内容?

WEB-INF/beans.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" bean-discovery-mode="all">
</beans>

扇区.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">

<h:head>
<title>Sector Test Entry</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<h:outputStylesheet name="css/screen.css" />
</h:head>
<h:body>
<ui:composition template="/template/common/commonLayout.xhtml">
<ui:define name="content">
<div id="content">
<h:form id="transaction" enctype="multipart/form-data">
<p:growl id="growl" life="2000" />
<p:panelGrid columns="2">

<p:outputLabel value="Update:"/>
<h:selectOneRadio id="update" value="#{dataUpdateBean.updateOption}">
<f:selectItem noSelectionOption="true" itemLabel="Sector" itemValue="Sector"/>
<f:selectItem itemLabel="Sub to Stocks" itemValue="Stocks"/>
</h:selectOneRadio>
<h:outputText value="&#160;" />
<p:fileUpload id="file" value="#{fileUploadController.file}" mode="simple" />

<h:commandButton action="#{fileUploadController.upload}"
value="Click Me" />


</p:panelGrid>
</h:form>

</div>
</ui:define>
</ui:composition>
</h:body>
</html>

FileUploadController.java

import java.text.SimpleDateFormat;

import javax.enterprise.inject.Model;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.Part;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

import com.traderpau.app.data.DataUpdateBean;

@Model
public class FileUploadController {

@Inject
private SectorUploadController sectorUploadController;

@Inject
private StockUploadController stockUploadController;

@Inject
private DataUpdateBean updateBean;

private UploadedFile file;

private Part filePart;


public Part getFilePart() {
return filePart;
}


public void setFilePart(Part filePart) {
this.filePart = filePart;
}


public UploadedFile getFile() {
return file;
}


public void setFile(UploadedFile file) {
this.file = file;
}

public void saveFile(){
System.out.println("File:" + file);
System.out.println("File part:" +
filePart);
}


@SuppressWarnings("unused")
public void upload() throws Exception{
String fileName = file.getFileName();

if(file != null) {
FacesMessage message = new FacesMessage("Succesful", fileName + " is uploaded.");
FacesContext.getCurrentInstance().addMessage(null, message);
}else{
FacesMessage message = new FacesMessage("Error in upload of " + fileName );
FacesContext.getCurrentInstance().addMessage(null, message);
}
String path = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/");
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmss");
if(updateBean.getUpdateOption().equalsIgnoreCase("Sector")){
file.write(
String.format("%s%s%s", path, "_TRADE_MONITOR_UPLOAD/SECTOR_TO_SUB/",fileName
));
sectorUploadController.parse(String.format("%s%s%s", path, "_TRADE_MONITOR_UPLOAD/SECTOR_TO_SUB/",fileName
));
FacesMessage message = new FacesMessage("Sector to Sub successdul.");
FacesContext.getCurrentInstance().addMessage(null, message);
}else if(updateBean.getUpdateOption().equalsIgnoreCase("Stocks")){
file.write(
String.format("%s%s%s", path, "_TRADE_MONITOR_UPLOAD/SUB_TO_STOCK/",fileName
));
stockUploadController.parse(String.format("%s%s%s", path, "_TRADE_MONITOR_UPLOAD/SUB_TO_STOCK/",fileName));
FacesMessage message = new FacesMessage("Sub to Stocks successful.");
FacesContext.getCurrentInstance().addMessage(null, message);
}
}
}

StockUploadController.java

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.enterprise.inject.Model;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;

import com.traderpau.app.data.DataUpdateBean;
import com.traderpau.app.model.Stock;
import com.traderpau.app.model.Subsector;
import com.traderpau.app.service.StockRegistration;
import com.traderpau.app.util.SubSectorToStockParser;

@Model
public class StockUploadController {
@Inject
private StockRegistration stockRegistration;

@Inject
private DataUpdateBean bean;

public void findSubsectorName(ActionEvent actionEvent){
addMessage("Search query:" + bean.getSubSectorName());
System.out.println("StockUploadController:findSubsectorName");
stockRegistration.findSubSectorName(bean.getSubSectorName());
}

public void addMessage(String summary) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, null);
FacesContext.getCurrentInstance().addMessage(null, message);
}

public void parse(String filename){

Map<String, List<String>> subSectorToStockMap = new HashMap<>();
SubSectorToStockParser parser = new SubSectorToStockParser(subSectorToStockMap);
parser.parse(filename);

}

public Subsector findSubsector(String name){
System.out.println("StockRegistration:" + stockRegistration);
return stockRegistration.findSubSectorName(name);
}

public void registerStock(Stock stock) throws Exception{
stockRegistration.register(stock);
}

}

SubSectorToStockParser.java

    import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import com.traderpau.app.controller.StockUploadController;
import com.traderpau.app.model.Stock;
import com.traderpau.app.model.Subsector;
import com.traderpau.app.service.StockRegistration;

public class SubSectorToStockParser implements Parser {

private Map<String, List<String>> subSectorToStockMap = new HashMap<>();

@Inject
private StockRegistration stockRegistration;

@Inject
private StockUploadController stockUploadController;

public SubSectorToStockParser(Map<String, List<String>> subSectorToStockMap) {
super();
this.subSectorToStockMap = subSectorToStockMap;
}

@Override
public void parse(String filename) {
System.out.println("Sub sector filename:" + filename);
BufferedReader br = null;
try{
br = new BufferedReader(new FileReader(filename));
String line;
String csvSplitBy = ",";
System.out.println("stockUploadController:" + stockUploadController );

while((line = br.readLine()) != null){
String[] subSectorToStockMapping = line.split(csvSplitBy);
Subsector subSector = stockUploadController.findSubsector(subSectorToStockMapping[4]);
Stock stock = new Stock();
stock.setSymbol(subSectorToStockMapping[0]);
stock.setStockName(subSectorToStockMapping[1]);
stock.setOutstandingShares( Double.parseDouble(subSectorToStockMapping[2]) );
stock.setSubSector(subSector != null? subSector: null);
stockUploadController.registerStock(stock);
}

}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

}

最佳答案

问题是使用“new”关键字实例化 SubSectorToStockParser

@Model
public class StockUploadController {
...
public void parse(String filename){

Map<String, List<String>> subSectorToStockMap = new HashMap<>();
SubSectorToStockParser parser = new SubSectorToStockParser(subSectorToStockMap); //SubSectorToStockParser should be injected
parser.parse(filename);

}
...

通过使用“new”关键字,CDI 无法控制结果对象的生命周期,因此无法执行注入(inject),导致 stockUploadController 为 null。

要解决此问题,请使用适当的范围(例如:@Model)标记 SubSectorToStockParser,然后将其注入(inject) StockUploadController。

关于java - 如何解决给出 NullPointerException 的@Inject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32228330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com