- PR -

Servlet上でDOMドキュメントをOutする際のエラーについて

1
投稿者投稿内容
ぬーだ
会議室デビュー日: 2009/03/11
投稿数: 8
投稿日時: 2009-03-11 03:04
まじめまして。
WindowsXP / Tomcat 6.0.18 / JDK 1.6.0.11にてWebアプリケーションを開発しています。

現在、AMLine(グラフを描画するFlash式のAjaxコンポーネント:JavaScriptから利用する)を用いて、DB上のデータを計算し表示する機能の作成を行っております。

※AMLineは設定ファイル(XML)のパスとデータファイル(XML)のパスをセットすることでグラフの描画を行います。


また、以下のような構成で機能を実現しています。


ブラウザ←JSP(JavaScript/AMLine)←[AMLine用データファイル(XML:サーブレットリクエストで取得)]←Servlet←DB


Eclipse上でXML生成のテストを行った際はXMLが正常に構築されたのですが(FileOutputStreamを使用)全く同じロジックでServletを用いた際に、全く同じデータを使用しているにもかかわらずXMLにて「NaN」となる箇所があります。

そこで質問なのですが、HttpServletResponseに保持されているOutputStreamオブジェクトは、double値を書き込む際の桁数制限等はあるのでしょうか?

ご存知の方がいらっしゃいましたら、教えていただけるとありがたいです。
よろしくお願いいたします。

--------------------------------------------------------------------------------
尚、以下がサーブレット内の処理の概要です。

1)DBから値を取得
2)1で取得した値を計算
3)2で計算した値を元にDOMドキュメント構築
4)response.getOutputStream()により、出力ストリームを取得
5)javax.xml.transform.Transformer#transform(DOMSource, OutputStream)により
出力ストリームにXML書き込み
--------------------------------------------------------------------------------
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2009-03-11 09:05
引用:

ぬーださんの書き込み (2009-03-11 03:04) より:
そこで質問なのですが、HttpServletResponseに保持されているOutputStreamオブジェクトは、double値を書き込む際の桁数制限等はあるのでしょうか?


OutputStreamはバイト指向のストリームなので無関係です。
double値のような概念はなく単なるバイト列を扱います。
他の原因を疑いましょう。
ぬーだ
会議室デビュー日: 2009/03/11
投稿数: 8
投稿日時: 2009-03-11 10:02
>OutputStreamはバイト指向のストリームなので無関係です。
確かに、仰る通りですね(^^);

しかも、よくよく考えてみれば、書き込むdouble値はtoString()メソッドでStringに変換した後DOMツリーに書き込んでいたので、やはり計算ロジックに問題があるとしか思えませんでした。



依然謎なのは、同一ロジックでDOMを構築しているのに、結果がそれぞれ異なるという点です。

「サーブレット/Eclipse上でのDOM書き込みテストクラス」のロジックの違いは、OutputStreamオブジェクトだけで、DOM構築ロジックは共通の物を使っている(つまりは、 Document UserClass#getXML()のようなメソッドをコールしている)ので、今一原因がつかめません。(DBを引くためのパラメータも合わせてあります)

※勿論、Tomcatで使用しているjarとEclipseで使用しているjarのタイムスタンプも確認しました。

もう少し探ってみます。
有難うございました。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2009-03-11 11:33
引用:

Eclipse上でXML生成のテストを行った際はXMLが正常に構築されたのですが(FileOutputStreamを使用)全く同じロジックでServletを用いた際に、全く同じデータを使用しているにもかかわらずXMLにて「NaN」となる箇所があります。


本当に同じデータかどうかを確認するのが早そうですね。
「同じはず」と思ってしまうことは多々有ります。

後は処理ロジックを含むJarが違う場合です。
コード:
Foo.class.getResource("Foo.class");


これを表示してみて、本当に同じクラスが示されているでしょうか。
ぬーだ
会議室デビュー日: 2009/03/11
投稿数: 8
投稿日時: 2009-03-11 12:16
>本当に同じデータかどうかを確認するのが早そうですね。
最初にサーブレットの試験をした時のURLパラメータをそのままコピーしてEclipse上でもテストしたので、利用するデータソースは同じです。
(因みに、デバックプリントを取って確認済みです)

また、jar違いに関しては、現在自作のjar
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2009-03-11 12:30
Factoryを使っているなら、Transformerが違うという可能性も。
ぬーだ
会議室デビュー日: 2009/03/11
投稿数: 8
投稿日時: 2009-03-11 12:43
>Factoryを使っているなら、Transformerが違うという可能性も。
Transformerの違いで、DOMのテキストノードのデータが変わる事はあるのでしょうか?

前回、書き込みのコミットミスをしてしまったので、前回の続き…

自作jarは一つなので、処理ロジックでjarを取り違えることは無いと思われます。

ただ、処理ロジックがテンプレートメソッドパターンになっており、引数で指定されたインタフェースによって処理が変わるので、ポリモルフィズムが悪さをしている可能性は否めません…(コード上は、全く同じインタフェースの実装を渡していますが)
ぬーだ
会議室デビュー日: 2009/03/11
投稿数: 8
投稿日時: 2009-03-11 15:49
色々と調査をした所、サーブレットクラス内でのrequest.getParameterの引数が間違っておりました。(しょうもない間違いですみません)

ソースを修正した所、現在は正常に動作しております。


お騒がせ致しました。
1

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