Actuellement à travers un tutoriel sur JOX inclus dans Sams Teach Yourself JavaServer Pages 2.0 avec Apache Tomcat dans 24 HeuresPourquoi la servlet d'analyse Java JOX ne parvient-elle pas à convertir un bean en chaîne?
Soit le com.wutka.jox a changé ou l'auteur manqué un ingrédient essentiel.
Lorsque je tente d'exécuter:
java "hu/flux/xml/XMLTestClient" "http://localhost:8080/SamsTeachYourselfJSP/joxparse" "d:\education\java\SamsTeachYourselfJSP\WebContent\test.xml"
Ma console CMD affiche:
Sending: d:\education\java\SamsTeachYourselfJSP\WebContent\test.xml
To: http://localhost:8080/SamsTeachYourselfJSP/joxparse
Received:
null
Et mes écrans de la console Eclipse:
Can't convert bean to String: null
java.lang.NullPointerException
at hu.flux.xml.TestBean.toString(TestBean.java:144)
at hu.flux.xml.JOXParseServlet.doPost(JOXParseServlet.java:50)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at hu.flux.logging.SessionRecorder.doFilter(SessionRecorder.java:61)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:242)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at hu.flux.timing.TimingFilter.doFilter(TimingFilter.java:62)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:242)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:163)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:556)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:401)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:267)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:245)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:260)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Returning String: null
Voici le code actuel pour le servlet :
package hu.flux.xml;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import com.wutka.jox.*;
import com.wutka.jox.test.*;
/**
* Servlet implementation class JOXParseServlet
*/
@SuppressWarnings("unused")
@WebServlet("/JOXParseServlet")
public class JOXParseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public JOXParseServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
com.wutka.jox.test.TestBean newBean = new com.wutka.jox.test.TestBean();
BufferedReader requestReader = request.getReader();
JOXBeanReader reader = new JOXBeanReader(requestReader);
reader.readObject(newBean);
// This servlet just sends a plain text response.
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
String beanString = null;
try { beanString = newBean.toString(); }
catch (Exception exc)
{
System.err.println("Can't convert bean to String: " + exc.getMessage());
exc.printStackTrace();
}
System.out.println ("Returning String: " + beanString);
out.println(beanString);
}
}
Ni XMLTestClient, ni test.xml sont susceptibles d'être le problème, car ils fonctionnent tous les deux avec succès avec un analyseur Sax et un analyseur Dom.
Cependant, dans le cas où il est utile ou intéressant de les voir, ils sont là:
<!-- test.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<name>
<first>Brian</first>
<last>Kessler</last>
</name>
////////////////////// //////////////////////
/**
* XMLTestClient.java
*/
package hu.flux.xml;
import java.io.*;
import java.net.*;
/**
* @author Brian Kessler
*
*/
public class XMLTestClient {
/**
*
*/
public XMLTestClient() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args)
{
try
{
// args[1] is the name of the file to send.
System.out.println("\n\nSending: " + args[1]);
System.out.println("To: " + args[0]);
System.out.println("\nReceived:\n\n");
try
{
File f = new File(args[1]);
int contentLength = (int) f.length();
// args[0] is the URL to send the file to.
URL url = new URL(args[0]);
URLConnection conn = url.openConnection();
// Tell the URLConnection that this is an XML file.
conn.setDoOutput(true);
conn.setRequestProperty("content-type", "text/xml");
conn.setRequestProperty("content-length", ""+contentLength);
FileInputStream in = new FileInputStream(f);
byte[] buffer = new byte[4096];
int len;
OutputStream out = conn.getOutputStream();
// Send the XML file to the servlet.
while ((len = in.read(buffer)) > 0)
{ out.write(buffer, 0, len); }
InputStream resp = conn.getInputStream();
// Read the response back from the servlet.
while ((len = resp.read(buffer)) > 0)
{ System.out.write(buffer, 0, len); }
}
catch (Exception exc)
{
System.err.println("Missing file argument: " + exc);
exc.printStackTrace();
}
}
catch (Exception exc) { exc.printStackTrace(); }
}
}
code postal pour 'TestBean', je suppose que vous pourriez avoir outrepassé' toString' –
N'a pas attrapé la source ... il fait partie de com.wutka.jox.test. Selon Eclipse est * devrait * retourner une chaîne. Il pourrait être le même que http://www.java2s.com/Open-Source/Java-Document/XML/jox/com/wutka/jox/test/TestBean.java.htm ... dans ce cas, il semble comme la dérogation existante pourrait effectivement être le problème. –