- PR -

サーブレットによるXMLデータのレスポンス方法について

1
投稿者投稿内容
KAI
会議室デビュー日: 2006/02/28
投稿数: 3
投稿日時: 2006-02-28 21:56
JAVAを勉強中です。つまらない質問ですがご教授お願いします
サーブレットを使用してMySQLより取得したデータをXML形式で表示させたいと思うのですが
((XmlDocument)doc).write(writer,encoding.toString()); の処理のところで


at java.lang.Thread.run(Unknown Source)が出力されます

発環境
・OS:Windows2000 Server
・jakarta-tomcat-4.1.30
・j2sdk-1_4_2_04
・wtp-all-in-one-sdk-1.0

初心で汚いソースではありますが下記にソースを記載いたします。
どうかご教授よろしくお願いいたいます。
PS.他に方法などありましたら教えて下さい


-------------------------------------------------------
package hoge;

import java.io.IOException;
import java.io.StringWriter;

import java.sql.*;
import javax.sql.DataSource;
import java.sql.Connection;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.crimson.tree.XmlDocument;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;


public class samp{
public Statement stat;
public int i = 0;
public ResultSetMetaData rm = null;
public ResultSet rs = null;
samp(DataSource dss){
DataSource dsr = (DataSource)dss;
try {
Connection con = dsr.getConnection();
stat = con.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
public String firstsqlGet() throws ParserConfigurationException, IOException{

String encoding = "Shift-JIS";
StringWriter writer = new StringWriter();
String Reslf = null;

try{
rs = stat.executeQuery("SELECT * FROM TEST");
rm = rs.getMetaData();
i = rm.getColumnCount();
xmlNode xml = new xmlNode();
xml.init();
Element root = xmlNode.doc.createElement("root");
xmlNode.doc.appendChild(root);

while(rs.next()){
Element elm = xmlNode.doc.createElement("FIL");
root.appendChild(elm);
for(int n=1; n<=i; n++){
Element el = xmlNode.doc.createElement(rm.getColumnName(n).toString());
Text txt = xmlNode.doc.createTextNode(rs.getObject(n).toString());
el.appendChild(txt);
elm.appendChild(el);
}
}
Reslf = xmlNode.xmlWriteString(encoding,writer);
}
catch(Exception e){
e.printStackTrace();
}

return Reslf;
}
}

class xmlNode {

DocumentBuilderFactory dbf;
DocumentBuilder db;
DOMImplementation domi;

static Document doc;
static org.apache.crimson.tree.XmlDocument xdoc;
static Element root;

public void init(){
dbf = DocumentBuilderFactory.newInstance();
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
domi = db.getDOMImplementation();
doc = db.newDocument();
}

static String xmlWriteString(
String encoding,
StringWriter writer){
try {
((XmlDocument)doc).write(writer,encoding.toString()); ← ここでエラー
} catch (IOException e) {
e.printStackTrace();
}
String result = writer.toString();
return result;
}
}

uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-03-01 00:23
引用:

KAIさんの書き込み (2006-02-28 21:56) より:

at java.lang.Thread.run(Unknown Source)が出力されます


肝心なところをわざわざ省略しないで、スタックトレースを全部載せてください。
KAI
会議室デビュー日: 2006/02/28
投稿数: 3
投稿日時: 2006-03-01 09:24
大変もうしわけありませんでした
スタックトレースを記載いたします
よろしくお願いいたします


java.lang.ClassCastException
at hoge.xmlNode.xmlWriteString(samp.java:96)
at hoge.samp.firstsqlGet(samp.java:61)
at hoge.postServlet.doPost(postServlet.java:54)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2006-03-01 13:04
エラーの一番下でなくて一番上が問題でしょう。
>java.lang.ClassCastException
>at hoge.xmlNode.xmlWriteString(samp.java:96)


Document doc;

XmlDocument doc;
として扱(cast)おうとしたけど、できなかった。
というエラーです。



はずしてるかもしれませんが
http://java-house.jp/ml/archive/j-h-b/044051.html
は参考になりませんか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-03-01 15:04
まんま書いてあるとおりdocがXmlDocument型のオブジェクトではないのでキャストできない、
ということですね。この質問に答えるのは実は3回目です

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18325&forum=12
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13263&forum=12
KAI
会議室デビュー日: 2006/02/28
投稿数: 3
投稿日時: 2006-03-02 09:56
的確なご指導有難うございました。沢山事例がありました。調査不足で申し訳ありません

方法といたしましては、
javax.xml.transform.Transformer.
transform(Source xmlSource, Result outputTarget)
を使用し問題解決する事ができました。

同時にご確認したいことがあります
レスポンスの送信を作成したxmlSourceの内容としたい場合、

javax.xml.transform.Result res = new StreamResult(response.getWriter());
transform(xmlSource, res)
で実装する事はできたのですが、この方法でよろしいのでしょうか?

最終的にやりたい事は、生成されてXMLデータを
CURLにて取得しデータとして処理させたい事です。


1

スキルアップ/キャリアアップ(JOB@IT)