request.getParameterNames()でIllegalArgumentException
2015年10月08日 21時52分09秒
JAVA:1.8.0
アプリケーションサーバ:Wildfly 8.1.0
リクエストが届いたら、ログにパラメータを出力するようにしています。
いちいちパラメータ名をハードコーディングしてgetParameterするわけにもいかないので、
getParameterNamesを使って、要素分getParameterしてログに出力しています。
しかし、あるリクエストが来た際、getParameterNamesでエラーが発生!!
エラーの詳細は
java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string:
原因を調べてみると、
パラメータ名にURLデコード出来ない文字、例えば%ssという文字が含まれた状態でリクエストが飛んできているのが原因でした。
getParameterNamesを実行すると、内部でURLDecoderのdecodeメソッドを実行している為、
decodeメソッドで、そんなのデコード出来ない!!と怒っているようです。
まぁこの問題自体は別にどうでもいいんですが、
問題は、URLデコード出来ない文字がパラメータに含まれていると、getParameterNamesまたはgetParameterが出来ず、
パラメータがログに出力出来ないってとこでした。
エラーメッセージには、不正な値が見つかった場所から2バイトしか出力してくれない為、
パラメータにはどんな値がセットされていたのか全く分かりません。
URLデコード出来ない文字が含まれていてもパラメータを確認する方法がないか調べたところ、
request.getInputStream()またはrequest.getReader()を使えば、
URLデコードしないのでエラーが発生することなくパラメータを確認することが出来ることが判明。
が、ここで新たな問題が。
getInputStream()、getReader()、getParameter()はそれぞれ排他関係にあるらしく
同一のリクエストではどれか1つしか使えないようになっている!!
どういう事かというと、getInputStream()を1度でも実行すると、同一のrequestでgetParameter()は使用出来なくなります!!
逆に、getParameter()を実行するとgetInputStream()は使用出来なくなります。
し、知らなかった(^^;
getInputStreamで生のデータをログ出力し、
生のデータを自前でparseしてFormにセットする等すればいいんでしょうが、
既にgetParameterを使用し、Formに値がセットされている状態なので、
getInputStreamを使うことも出来ず。
リフレクションを使ってフラグを変えて、getInputStream後でもgetParameterが使えないか、
強引な方法も試してみましたが、結局出来ず。諦めました。(T-T)
アプリケーションサーバ:Wildfly 8.1.0
リクエストが届いたら、ログにパラメータを出力するようにしています。
いちいちパラメータ名をハードコーディングしてgetParameterするわけにもいかないので、
getParameterNamesを使って、要素分getParameterしてログに出力しています。
しかし、あるリクエストが来た際、getParameterNamesでエラーが発生!!
エラーの詳細は
java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string:
原因を調べてみると、
パラメータ名にURLデコード出来ない文字、例えば%ssという文字が含まれた状態でリクエストが飛んできているのが原因でした。
getParameterNamesを実行すると、内部でURLDecoderのdecodeメソッドを実行している為、
decodeメソッドで、そんなのデコード出来ない!!と怒っているようです。
まぁこの問題自体は別にどうでもいいんですが、
問題は、URLデコード出来ない文字がパラメータに含まれていると、getParameterNamesまたはgetParameterが出来ず、
パラメータがログに出力出来ないってとこでした。
エラーメッセージには、不正な値が見つかった場所から2バイトしか出力してくれない為、
パラメータにはどんな値がセットされていたのか全く分かりません。
URLデコード出来ない文字が含まれていてもパラメータを確認する方法がないか調べたところ、
request.getInputStream()またはrequest.getReader()を使えば、
URLデコードしないのでエラーが発生することなくパラメータを確認することが出来ることが判明。
が、ここで新たな問題が。
getInputStream()、getReader()、getParameter()はそれぞれ排他関係にあるらしく
同一のリクエストではどれか1つしか使えないようになっている!!
どういう事かというと、getInputStream()を1度でも実行すると、同一のrequestでgetParameter()は使用出来なくなります!!
逆に、getParameter()を実行するとgetInputStream()は使用出来なくなります。
し、知らなかった(^^;
getInputStreamで生のデータをログ出力し、
生のデータを自前でparseしてFormにセットする等すればいいんでしょうが、
既にgetParameterを使用し、Formに値がセットされている状態なので、
getInputStreamを使うことも出来ず。
リフレクションを使ってフラグを変えて、getInputStream後でもgetParameterが使えないか、
強引な方法も試してみましたが、結局出来ず。諦めました。(T-T)
PR
POIでマクロ有効ブック(xlsm)の作成
2015年05月27日 21時49分35秒
Apache POIでOpen XML形式(2007形式)のマクロ有効ブック(xlsm)を新規作成したくて色々と挑戦。
xlsxで保存することは出来ましたが、xlsmでは保存できず。(下記参照)
http://tetu.zouri.jp/java/poi/excel/excel.html
正確には、POIの処理は正常に完了し、xlsmファイルも出力はされました。
正確には、POIの処理は正常に完了し、xlsmファイルも出力はされました。
しかし、Excelで作成したファイルを開くと下記のエラーが発生してしまいます。
Excelでファイル'○○.xlsm'を開くことが出来ません。ファイル形式またはファイル拡張子が正しくありません。ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。
原因を調べてみたところ、POIのXSSFWorkbookで出力を行うと、xlsx形式で保存するようです。
なので、拡張子をxlsmにしても内容はxlsx。
Excelで保存したxlsxで保存したファイルの拡張子をxlsmに変更して開いても同様のエラーになります。
これについては公式でも説明がありました。
http://poi.apache.org/spreadsheet/limitations.html
英語は得意ではないですが、下記のようなことを書いているっぽいです。
英語は得意ではないですが、下記のようなことを書いているっぽいです。
Macros can not be created. The are currently no plans to support macros. However, reading and re-writing files containing macros will safely preserve the macros.
マクロは作成出来ない。マクロをサポートする予定もない。
ただし、マクロを読み込むこと、マクロを再出力することは出来る。
要は、xlsmを新規作成は出来ない。
要は、xlsmを新規作成は出来ない。
しかし、作成済みのxlsmは正常に読み込めて、保存も可能ってことですね。
では、JAVAでxlsmを新規作成するにはどうしたらいいか?
まず、Excelで内容が何もない状態でxlsmで保存。
まず、Excelで内容が何もない状態でxlsmで保存。
これをテンプレートとします。
POIでテンプレートを読み込み、色々と編集を行い、別名で保存。拡張子はxlsm。
これでマクロ有効ブック(xlsm)の状態で新規作成することが可能です。