I am doing an electronic invoice system project in spring boot with the SOAP library, now when I issue the XML file of the electronic invoice, I get a hashcode of the XML file of the electronic invoice, I am trying to update hashcode in an existing record of the invoice. The invoice has its own classes like Repository, Service, Controller. Until then I have no problem, the problem is the LecturaXML class to inject into the invoice service class. I get an error, indicating NULL.
我正在用Soap库在Spring Boot中做一个电子发票系统项目,现在当我发布电子发票的XML文件时,我得到了电子发票的XML文件的哈希码,我正在尝试更新现有发票记录中的哈希码。发票有自己的类,如Repository、Service、Controller。在此之前,我没有任何问题,问题是要注入发票服务类的LecturaXML类。我收到一个错误,指示为空。
BoletaRepository
Boleta存储库
@Repository
public interface BoletaRepository extends SearchRepository<Boleta, Long> {
public Long countById(Long id);
@Query("SELECT MAX(numeroBoleta) FROM Boleta")
public Integer obtenerUltimoNumeroSerieBoleta();
@Query("SELECT c FROM Boleta c WHERE c.numeroBoleta LIKE %?1%")
@Override
public Page<Boleta> findAll(String keyword, Pageable pageable);
@Query("UPDATE Boleta c SET c.enabled = ?2 WHERE c.id = ?1")
@Modifying
public void updateBoletaEnabledStatus(Long id, boolean enabled);
@Query("UPDATE Boleta c SET c.hashcodeticketBoleta = ?2 WHERE c.id = ?1")
@Modifying
public void actualizarHashCodeBoleta(Long id, String hashcodeticketBoleta);
@Query("UPDATE Boleta c SET c.pendienteticketBoleta = ?2 WHERE c.id = ?1")
@Modifying
public void actualizarEstadoBoleta(Long id, String pendienteticketBoleta);
}
BoletaService
BoletaService
@Service
@Configurable
public class BoletaService {
public static final Logger LOGGER = Logger.getLogger(BoletaService.class.getName());
public static final int BOLETAS_PER_PAGE = 15;
@Autowired
private BoletaRepository boletaRepo;
public Boleta saveBoleta(Boleta boleta) {
return boletaRepo.save(boleta);
}
public void actualizarHashCodeBoleta(Long id, String hashcodeticketBoleta) {
boletaRepo.actualizarHashCodeBoleta(id, hashcodeticketBoleta);
}
public void actualizarEstadoBoleta(Long id, String estadoBoleta) {
boletaRepo.actualizarEstadoBoleta(id, estadoBoleta);
}
public Boleta get(Long id) throws BoletaNotFoundException {
try {
return boletaRepo.findById(id).get();
} catch (NoSuchElementException ex) {
throw new BoletaNotFoundException("NO ENCONTRAMOS BOLETA CON ESTE NUMERO " + id);
}
}
}
LecturaXML
XML课程
@Component
public class LecturaXML {
private static final Log log = LogFactory.getLog(LecturaXML.class);
@Autowired
private BoletaService serviceBoleta;
private String codehash;
private String estado;
public String getCodehash() {
return codehash;
}
public void setCodehash(String codehash) {
this.codehash = codehash;
}
public String getEstado() {
return estado;
}
public void setEstado(String estado) {
this.estado = estado;
}
public String getRespuestaSunat(String path) {
String respuesta = null;
String nota = null;
try {
log.info("LecturaXML.getRespuestaSunat - iniciamos Lectura del contenido del CDR " + path);
DocumentBuilderFactory fabricaCreadorDocumento = DocumentBuilderFactory.newInstance();
DocumentBuilder creadorDocumento = fabricaCreadorDocumento.newDocumentBuilder();
Document documento = creadorDocumento.parse(path);
//Obtener el elemento raíz del documento
Element raiz = documento.getDocumentElement();
//Obtener la lista de nodos que tienen etiqueta "ds:Reference"
NodeList responsecode = raiz.getElementsByTagName("cbc:ResponseCode");
for (int i = 0; i < responsecode.getLength(); i++) {
Node empleado = responsecode.item(i);
Node datoContenido = empleado.getFirstChild();
respuesta = datoContenido.getNodeValue();
}
NodeList nodesc = raiz.getElementsByTagName("cbc:Description");
for (int i = 0; i < nodesc.getLength(); i++) {
Node empleado = nodesc.item(i);
Node datoContenido = empleado.getFirstChild();
respuesta = respuesta + "|" + datoContenido.getNodeValue();
}
NodeList note = raiz.getElementsByTagName("cbc:Note");
for (int i = 0; i < note.getLength(); i++) {
Node empleado = note.item(i);
Node datoContenido = empleado.getFirstChild();
nota = nota + datoContenido.getNodeValue() + "\\n";
}
String[] cdr = respuesta.split("\\|", 0);
//=== Guardar el link
if (cdr[0].equals("0")) {
this.setEstado("A");
}
log.info("LecturaXML.getRespuestaSunat - resultado del CDR Observacion: " + Arrays.toString(cdr).trim());
log.info("LecturaXML.getRespuestaSunat - resultado del CDR Observacion: " + nota);
log.info("LecturaXML.getRespuestaSunat - resultado del CDR codigo: " + cdr[0]);
log.info("LecturaXML.getRespuestaSunat - resultado del CDR Nota: " + cdr[1]);
} catch (org.xml.sax.SAXException ex) {
respuesta = "LecturaXML.getRespuestaSunat - ERROR: org.xml.sax.SAXException - El formato XML del fichero no es correcto\n : " + ex.getMessage();
log.error(respuesta);
} catch (IOException ex) {
respuesta = "LecturaXML.getRespuestaSunat - ERROR: IOException - Error al leer el archivo de respuesta : " + ex.getMessage();
log.error(respuesta);
} catch (ParserConfigurationException ex) {
respuesta = "LecturaXML.getRespuestaSunat - ERROR: ParserConfigurationException - ERROR: No se ha podido crear el generador de documentos XML\n : " + ex.getMessage();
log.error(respuesta);
} catch (DOMException ex) {
respuesta = "LecturaXML.getRespuestaSunat - ERROR: DOMException : " + ex.getMessage();
log.error(respuesta);
}
return respuesta;
}
/**
* Metodo para obtener Respuesta Sunat con ticket
*
* @param path
* @return respuesta
*/
public String getRespuestaSunatTicketfe(String path) {
String respuesta = null;
String nota = "";
try {
log.info("LecturaXML.getRespuestaSunatTicket - iniciamos Lectura del contenido del CDR " + path);
DocumentBuilderFactory fabricaCreadorDocumento = DocumentBuilderFactory.newInstance();
DocumentBuilder creadorDocumento = fabricaCreadorDocumento.newDocumentBuilder();
Document documento = creadorDocumento.parse(path);
//Obtener el elemento raíz del documento
Element raiz = documento.getDocumentElement();
//Obtener la lista de nodos que tienen etiqueta "ds:Reference"
NodeList responsecode = raiz.getElementsByTagName("cbc:ResponseCode");
for (int i = 0; i < responsecode.getLength(); i++) {
Node empleado = responsecode.item(i);
Node datoContenido = empleado.getFirstChild();
respuesta = datoContenido.getNodeValue();
}
NodeList nodesc = raiz.getElementsByTagName("cbc:Description");
for (int i = 0; i < nodesc.getLength(); i++) {
Node empleado = nodesc.item(i);
Node datoContenido = empleado.getFirstChild();
respuesta = respuesta + "|" + datoContenido.getNodeValue();
}
NodeList note = raiz.getElementsByTagName("cbc:Note");
for (int i = 0; i < note.getLength(); i++) {
Node empleado = note.item(i);
Node datoContenido = empleado.getFirstChild();
nota = nota + datoContenido.getNodeValue() + "\\n";
}
String[] cdr = respuesta.split("\\|", 0);
//=== Guardar el link
log.info("LecturaXML.getRespuestaTicketSunatTicket - resultado del CDR Observacion: " + nota);
log.info("LecturaXML.getRespuestaTicketSunatTicket - resultado del CDR codigo: " + cdr[0]);
log.info("LecturaXML.getRespuestaTicketSunatTicket - resultado del CDR Nota: " + cdr[1]);
} catch (org.xml.sax.SAXException ex) {
respuesta = "LecturaXML.getRespuestaSunatTicket - ERROR: org.xml.sax.SAXException - El formato XML del fichero no es correcto\n : " + ex.getMessage();
log.error(respuesta);
} catch (IOException ex) {
respuesta = "LecturaXML.getRespuestaSunatTicket - ERROR: IOException - Error al leer el archivo de respuesta : " + ex.getMessage();
log.error(respuesta);
} catch (ParserConfigurationException ex) {
respuesta = "LecturaXML.getRespuestaSunatTicket - ERROR: ParserConfigurationException - ERROR: No se ha podido crear el generador de documentos XML\n : " + ex.getMessage();
log.error(respuesta);
} catch (DOMException ex) {
respuesta = "LecturaXML.getRespuestaSunatTicket - ERROR: DOMException : " + ex.getMessage();
log.error(respuesta);
} finally {
}
return respuesta;
}
public void guardarHashYBarCodePDF417(String tipoDoc, String trans, String accion, String pathXMLFile) {
try {
String hashCode = obtenerDigestValue(pathXMLFile);
/*============ALMACENANDO BarcodePDF417(codigo de Barra)=========*/
BarcodePDF417 barcode = new BarcodePDF417();
String infobarcode = tipoDoc.equals("20") ? getInfoToBarCodeOD(pathXMLFile) : getInfoToBarCode(pathXMLFile);
infobarcode = infobarcode.replaceAll("\n", "");
log.info("==>infoBarcode:" + infobarcode);
barcode.setCode(infobarcode);
java.awt.Image img = barcode.createAwtImage(Color.BLACK, Color.WHITE);
BufferedImage outImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
outImage.getGraphics().drawImage(img, 0, 0, null);
ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
ImageIO.write(outImage, "png", bytesOut);
bytesOut.flush();
byte[] pngImageData = bytesOut.toByteArray();
InputStream is = new ByteArrayInputStream(pngImageData);
log.info("LecturaXML.obtenerDigestValue BarCodePDF417 - resultado HashCode : " + hashCode);
} catch (IOException ex) {
log.error("==>Error en generación de hash o barCode:" + ex.getMessage());
} finally {
}
}
public void guardarHashYBarCodeQR(String tipoDoc, String numeroDocu, String pathXMLFile, Boleta boleta) {
try {
String hashCode = obtenerDigestValue(pathXMLFile);
this.codehash = hashCode;
/*============ALMACENANDO BarcodePDF417(codigo de Barra)=========*/
//QRCodeWriter barcode = new QRCodeWriter();
String infobarcode = tipoDoc.equals("20") ? getInfoToBarCodeOD(pathXMLFile) : getInfoToBarCode(pathXMLFile);
infobarcode = infobarcode.replaceAll("\n", "");
log.info("==>infoBarcode:" + infobarcode);
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(infobarcode, BarcodeFormat.QR_CODE, 350, 350);
Path path = FileSystems.getDefault().getPath(pathXMLFile.replace("xml", "png"));
MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream);
byte[] pngImageData = pngOutputStream.toByteArray();
InputStream is = new ByteArrayInputStream(pngImageData);
log.info("LecturaXML.obtenerDigestValue BarCodeQR - resultado HashCode : " + hashCode);
log.info("LecturaXML Guardando HashCode en la Boleta : " + this.codehash);
System.out.println("Estado de la Boleta : " + this.getEstado());
serviceBoleta.actualizarHashCodeBoleta(boleta.getId(), this.codehash);
} catch (WriterException | IOException ex) {
log.error("==>Error en generación de hash o barCode:" + ex.getMessage());
}
}
public String obtenerDigestValue(String path) {
String firma = null;
try {
DocumentBuilderFactory fabricaCreadorDocumento = DocumentBuilderFactory.newInstance();
DocumentBuilder creadorDocumento = fabricaCreadorDocumento.newDocumentBuilder();
Document documento = creadorDocumento.parse(path);
//Obtener el elemento raíz del documento
Element raiz = documento.getDocumentElement();
//Obtener la lista de nodos que tienen etiqueta "ds:Reference"
NodeList listaEmpleados = raiz.getElementsByTagName("ds:Reference");
//Recorrer la lista de empleados
for (int i = 0; i < listaEmpleados.getLength(); i++) {
//Obtener de la lista un empleado tras otro
Node empleado = listaEmpleados.item(i);
//Obtener la lista de los datos que contiene ese ds:Reference
NodeList datosEmpleado = empleado.getChildNodes();
//Recorrer la lista de los datos que contiene el ds:Reference
for (int j = 0; j < datosEmpleado.getLength(); j++) {
//Obtener de la lista de datos un dato tras otro
Node dato = datosEmpleado.item(j);
//Comprobar que el dato se trata de un nodo de tipo Element
if (dato.getNodeType() == Node.ELEMENT_NODE) {
//Mostrar el nombre del tipo de dato
if (dato.getNodeName() == "ds:DigestValue") {
//El valor está contenido en un hijo del nodo Element
Node datoContenido = dato.getFirstChild();
//Mostrar el valor contenido en el nodo que debe ser de tipo Text
if (datoContenido != null && datoContenido.getNodeType() == Node.TEXT_NODE) {
//System.out.println(datoContenido.getNodeValue());
if (datoContenido.getNodeValue() != null) {
firma = datoContenido.getNodeValue();
}
}
}
}
}
}
} catch (org.xml.sax.SAXException ex) {
log.error("ERROR: El formato XML del fichero no es correcto\n" + ex.getMessage());
} catch (IOException ex) {
log.error("ERROR: Se ha producido un error al leer el fichero\n" + ex.getMessage());
} catch (ParserConfigurationException ex) {
log.error("ERROR: No se ha podido crear el generador de documentos XML\n" + ex.getMessage());
}
return firma;
}
public String getInfoToBarCode(String path) {
String respuesta = "";
try {
String IssueDate = "";
DocumentBuilderFactory fabricaCreadorDocumento = DocumentBuilderFactory.newInstance();
DocumentBuilder creadorDocumento = fabricaCreadorDocumento.newDocumentBuilder();
Document documento = creadorDocumento.parse(path);
//Obtener el elemento raíz del documento
Element raiz = documento.getDocumentElement();
//=====RUC
NodeList nodlist = raiz.getElementsByTagName("cac:PartyIdentification");
respuesta += nodlist.item(0).getTextContent() + "|";
//=====InvoiceTypeCode
NodeList InvoiceTypeCode = raiz.getElementsByTagName("cbc:InvoiceTypeCode").item(0) == null ? raiz.getElementsByTagName("cbc:ResponseCode") : raiz.getElementsByTagName("cbc:InvoiceTypeCode");
respuesta += InvoiceTypeCode.item(0).getTextContent() + "|";
//=====cbc:ID
nodlist = raiz.getChildNodes();
for (int i = 0; i < nodlist.getLength(); i++) {
Node nod = nodlist.item(i);
if (nod.getNodeName().equals("cbc:ID")) {
respuesta += nod.getTextContent().replaceAll("-", "|") + "|";
}
if (nod.getNodeName().equals("cbc:IssueDate")) {
IssueDate = nod.getTextContent();
}
}
//=====>LegalMonetaryTotal
nodlist = raiz.getElementsByTagName("cac:LegalMonetaryTotal").item(0) == null ? raiz.getElementsByTagName("cac:RequestedMonetaryTotal").item(0).getChildNodes() : raiz.getElementsByTagName("cac:LegalMonetaryTotal").item(0).getChildNodes();
for (int i = 0; i < nodlist.getLength(); i++) {
Node nod = nodlist.item(i);
if (nod.getNodeName().equals("cbc:TaxExclusiveAmount")) { //NO EN : ND
respuesta += nod.getTextContent() + "|";
}
if (nod.getNodeName().equals("cbc:PayableAmount")) {
respuesta += nod.getTextContent() + "|";
}
}
//=====>IssueDate
respuesta += IssueDate + "|";
log.info(respuesta);
//=====>AccountingCustomerParty
nodlist = raiz.getElementsByTagName("cac:AccountingCustomerParty").item(0).getChildNodes();
for (int i = 0; i < nodlist.getLength(); i++) {
Node nod = nodlist.item(i);
if (nod.getNodeName().equals("cbc:AdditionalAccountID")) {
respuesta += nod.getTextContent() + "|";
}
}
for (int i = 0; i < nodlist.getLength(); i++) {
Node nod = nodlist.item(i);
if (nod.getNodeName().equals("cbc:CustomerAssignedAccountID")) {
respuesta += nod.getTextContent() + "|";
}
}
} catch (org.xml.sax.SAXException ex) {
respuesta = "LecturaXML:org.xml.sax.SAXException - ERROR: Al leer el archivo de respuesta" + ex.getMessage();
log.error(respuesta);
} catch (IOException ex) {
respuesta = "LecturaXML:Error IOException - ERROR: Al leer el archivo de respuesta" + ex.getMessage();
log.error(respuesta);
} catch (ParserConfigurationException ex) {
respuesta = "LecturaXML:Error ParserConfigurationException - ERROR: No se ha podido crear el generador de documentos XML\n" + ex.getMessage();
log.error(respuesta);
} catch (DOMException exg) {
respuesta = "LecturaXML:Error DOMException - ERROR: Al leer el archivo de respuesta" + path + "en getInfoToBarCode" + exg.getMessage();
log.error(respuesta);
}
return respuesta;
}
public String getInfoToBarCodeOD(String path) {
String respuesta = "";
try {
String IssueDate = "";
DocumentBuilderFactory fabricaCreadorDocumento = DocumentBuilderFactory.newInstance();
DocumentBuilder creadorDocumento = fabricaCreadorDocumento.newDocumentBuilder();
Document documento = creadorDocumento.parse(path);
//Obtener el elemento raíz del documento
Element raiz = documento.getDocumentElement();
//=====RUC
NodeList nodlist = raiz.getElementsByTagName("cac:PartyIdentification");
respuesta += nodlist.item(0).getTextContent() + "|";
//=====InvoiceTypeCode
//NodeList InvoiceTypeCode = raiz.getElementsByTagName("cbc:InvoiceTypeCode").item(0) == null ? raiz.getElementsByTagName("cbc:ResponseCode") : raiz.getElementsByTagName("cbc:InvoiceTypeCode");
respuesta += "20" + "|";//InvoiceTypeCode.item(0).getTextContent() + "|";
//=====cbc:ID
nodlist = raiz.getChildNodes();
for (int i = 0; i < nodlist.getLength(); i++) {
Node nod = nodlist.item(i);
if (nod.getNodeName().equals("cbc:ID")) {
respuesta += nod.getTextContent().replaceAll("-", "|") + "|";
}
if (nod.getNodeName().equals("cbc:IssueDate")) {
IssueDate = nod.getTextContent();
}
}
//=====>LegalMonetaryTotal
nodlist = raiz.getElementsByTagName("cbc:TotalInvoiceAmount");
respuesta += nodlist.item(0).getTextContent() + "|";
nodlist = raiz.getElementsByTagName("sac:SUNATTotalPaid");
respuesta += nodlist.item(0).getTextContent() + "|";
//=====>IssueDate
respuesta += IssueDate + "|";
//=====>AccountingCustomerParty
nodlist = raiz.getElementsByTagName("cac:ReceiverParty").item(0).getChildNodes();
for (int i = 0; i < nodlist.getLength(); i++) {
Node nod = nodlist.item(i);
if (nod.getNodeName().equals("cac:PartyIdentification")) {
NodeList noi = nod.getChildNodes();
for (int x = 0; x < noi.getLength(); x++) {
Node nodx = noi.item(x);
if (nodx.getNodeName().equals("cbc:ID")) {
respuesta += nodx.getAttributes().getNamedItem("schemeID").getTextContent() + "|";
respuesta += nodx.getTextContent() + "|";
}
}
}
}
for (int i = 0; i < nodlist.getLength(); i++) {
Node nod = nodlist.item(i);
if (nod.getNodeName().equals("cbc:CustomerAssignedAccountID")) {
respuesta += nod.getTextContent() + "|";
}
}
} catch (org.xml.sax.SAXException ex) {
System.out.println("ERROR: El formato XML del fichero no es correcto\n" + ex.getMessage());
respuesta = "Error al leer el archivo de respuesta";
} catch (IOException ex) {
System.out.println("Error al leer el archivo de respuesta\n" + ex.getMessage());
respuesta = "Error al leer el archivo de respuesta";
} catch (ParserConfigurationException ex) {
System.out.println("ERROR: No se ha podido crear el generador de documentos XML\n" + ex.getMessage());
respuesta = "Error al leer el archivo de respuesta";
} catch (DOMException exg) {
System.out.println("==>Error while reading file " + path + " on getInfoToBarCode(path)\n");
}
return respuesta;
}
}
I get this error on Null
我在Null上收到此错误
2023-09-10T16:32:12.240-05:00 INFO 36024 --- [nio-8081-exec-5] p.com.carbonstar.admin.util.LecturaXML : LecturaXML.obtenerDigestValue BarCodeQR - resultado HashCode : MTIpa+f0o7DYKtZebc7jJOviqjc=
2023-09-10T16:32:12.240-05:00 INFO 36024 --- [nio-8081-exec-5] p.com.carbonstar.admin.util.LecturaXML : LecturaXML Guardando HashCode en la Boleta : MTIpa+f0o7DYKtZebc7jJOviqjc=
Estado de la Boleta : null
2023-09-10T16:32:12.243-05:00 ERROR 36024 --- [nio-8081-exec-5] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/admin] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "pe.com.carbonstar.admin.boleta.BoletaService.actualizarHashCodeBoleta(java.lang.Long, String)" because "this.serviceBoleta" is null] with root cause
java.lang.NullPointerException: Cannot invoke "pe.com.carbonstar.admin.boleta.BoletaService.actualizarHashCodeBoleta(java.lang.Long, String)" because "this.serviceBoleta" is null
at pe.com.carbonstar.admin.util.LecturaXML.guardarHashYBarCodeQR(LecturaXML.java:231) ~[classes/:na]
at pe.com.carbonstar.admin.cpews.BolElectronica.generarXMLZipiadoBoleta(BolElectronica.java:89) ~[classes/:na]
at pe.com.carbonstar.admin.boleta.BoletaController.generarBoletaElectronica(BoletaController.java:620) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
更多回答
Add relevant code from BolElectronica.java
and BoletaController.java:620
. I suspect you're using a POJO LecturaXML object as I already commented on your previous question.
添加来自BolElectronica.java和BoletaController.java:620的相关代码。我怀疑您正在使用POJO LecturaXML对象,因为我已经对您的上一个问题进行了评论。
Please share the package details of these classes as well as your @ComponentScan
annotation configuration in addition to what @void void requested. Since you might be using the aforementioned annotation implicitly via @SpringBootApplication
, please include the class with this annotation and its package name as well.
请分享这些类的包详细信息以及您的@ComponentScan注释配置,以及@void请求的内容。由于您可能会通过@SpringBootApplication隐式地使用前面提到的注释,因此请将类与此注释一起包含在内,并将其包名包括在内。
I'm going to try to upload it on Github. Stackoverflow doesn't allow me to add more code.
我要试着把它上传到Github上。StackOverflow不允许我添加更多代码。
This is the relevant snippet from your repository (BolElectronica.java):
以下是您的存储库(BolElectronica.java)中的相关代码片段:
LecturaXML lectura = new LecturaXML();
org.apache.xml.security.Init.init();
String resultado = "";
String unidadEnvio = Util.getPathZipFilesEnvio(items.getEmpr_nroruc(), items.getDocu_fecha());
log.info("Ruta de Unidad de Envio : " + unidadEnvio);
String pathXMLFile;
try {
log.info("generarXMLZipiadoBoleta - Extraemos datos para preparar XML ");
log.info("generarXMLZipiadoBoleta - Ruta de directorios " + unidadEnvio);
log.info("generarXMLZipiadoBoleta - Iniciamos cabecera ");
if (items != null) {
pathXMLFile = unidadEnvio + items.getEmpr_nroruc() + "-03-" + items.getDocu_numero() + ".xml";
//======================crear XML =======================
resultado = creaXml(items, detdocelec, leyendas, unidadEnvio);
log.info(resultado);
//======================guardar Hash Y Barcode QR =======================
log.info("generarXMLZipiadoBoleta - Crear Hashcode y CodeBarQR");
lectura.guardarHashYBarCodeQR(items.getDocu_tipodocumento(), items.getDocu_numero(), pathXMLFile, items.getDocu_boleta());
The lectura
instance is not a bean managed by spring, so it does not have the dependencies injected. Either provide them with a constructor or in some other way, or use the BolElectronica
instance from the spring context by injecting it somewhere appropriate.
Lesstura实例不是由Spring管理的Bean,因此它没有注入依赖项。或者为它们提供构造函数或以其他方式,或者通过在适当的位置注入来自Spring上下文的BolElectronica实例来使用它。
To clarify: the serviceBoleta
private field is null in your lectura
instance because you created the lectura
instance yourself, and this is probably not what you want to do as you already have a singleton instance in the spring context which has the serviceBoleta
field injected using reflection because you are using the @Autowired
annotation.
需要澄清的是:在您的lectura实例中,serviceBoleta私有字段为空,因为您自己创建了lectura实例,而这可能不是您想要做的,因为您在Spring上下文中已经有一个Singleton实例,该实例使用反射注入了serviceBoleta字段,因为您使用的是@Autwire注释。
更多回答
Thank you @void-void, So, I make a little code to update in the class BolElectronica.java
所以,我在BolElectronica.java类中编写了一些更新代码
I have tried to do it in the Class BolElectronica.java, and the same error also appears.
我曾尝试在类BolElectronica.java中这样做,但同样的错误也出现了。
我是一名优秀的程序员,十分优秀!