JasperReportでのStyle適用

JasperReportをEclipse上でエディター使って編集していたら、Styleを設定できて、且つ、Condition Styleってのが使えることを知ったので使ってみようとしたら、どハマりした。。。

まず、例としてTextFieldで考えると、プロパティの適用順はStyle→個別の順で設定され、後勝ちのようだ。そのため、各個別のTextFieldで例えば背景色などが設定されていると、Style指定していても、個別設定側が優先される。

このとき、GUIでプロパティ設定していると、どうやら罫線などのいくつかのプロパティは「未設定のように見えて未設定になっていない」場合がある。GUI上では未設定(灰色で文字表示)とされていても、ソースを見ると、例えば罫線などは「0px」になっているだけで、設定としては残っている。これがややこしくしている原因になっている。

そのため、ソースで直接該当のプロパティを消すなどして対応する必要があり、特に誤って設定してしまった場合などは注意が必要となる。

というわけで、ここ1週間くらい悩んだことが解決したので、覚書。。。

JasperReportにおける行の拡張

Javaの帳票出力で、JasperReportを使用し始めている。10年前には聞いたことなかったけど、今は結構スタンダードのようだ。

で、このJasperReportではEclipseでテンプレートをイメージ編集できるのだけど(この辺については別途纏めよう。。。)、そのとき、各フィールドの自動拡張がどのように設定できるのかが、分からなくて、路頭に迷った。。。

結果として、該当の「TextField」ー「プロパティー」ー「テキスト・フィールド」ー「Text Adjust」で「StretchHeight」を選択することで縦に延びる。さらに、「外観」において「Streatch Type」を設定しておくことで、他のTextFieldに追随して外観を延ばすことができる。この「外観」と「テキスト・フィールド」の設定の関係性で、Band内の様子が変わるので、諸々試すといい。

というわけで、取り急ぎ、備忘録でした。

Axis2でJSON出力 続き。。。

先日書いた「Axis2でJSON出力」で、独自データクラスを作成して戻り値として利用した場合のこと。

extendsで何かを継承してしまうと、同じパッケージ内であろうと、エラーになった。。。

Error while writing to the output stream using JsonWriter

このエラー、なんで出ているのか、全くわからなくて、単純なサービスだけにして実験してみて初めてわかった。。。これ以上深追いするのが時間的に許されないけれど、おそらくJsonWriter内の処理に問題があるんだろう。もしくは、データクラスでの継承を想定していないか。。。

 

ま、どちらにしても、とりあえず、JSONで独自データクラスを送る場合は、継承しないのがいいみたいだ。。。

 

ではでは。

Tomcat8.5における認証パスワードのDigest化

嵌まったねぇ~w

まず、Tomcatでは、BASIC、DIGEST、FORMなどの認証は、当たり前のようにサポートされている。で、Digest認証っていうのは、通信の際のパスワードを暗号化するもので、例えばJDBCでのパスワード検証を行おうとすると、DBの中にいれておくのは、平文となる。

ここで、「平文での保存はねぇ。。。。」と思うのが普通で、パスワード自体を暗号化して保存しておきたくなる。ここからが、今回の嵌まりどころ。

まず、Tomcatでは、Realmディレクティブに対して「digest=”MD5″」みたいなattributeを加えれば、パスワード照合をMD5でやる!っていうふうな記事をいくつもみつけたので、それに従ったけど、まったく暗号化された文字列では照合せず、平文バリバリで照合していた。

で、最終的に辿り着いたのは、StackOverflowの記事と、(やっぱり)本家Apacheの文章。そこでわかったのが、Realm定義の中側に、「CredentialHandler」の定義が必要で、その中でMD5なりSHAなりを指定する必要があるということ。なので、こんな感じのcontext.xmlを書く事になる。

さらに、MD5のDigestedなパスワードも、いわゆる32桁のハッシュ値ではなくて、Javaのライブラリを使ったものである必要がある。これがよくわからず、結果的に1日費やして、やっとわかった。いや、本家のサイトには「パスワードを生成する2つの方法」として書いてある。。。ちゃんと本家のサイトの通りにやらないといけないのね。。。w

これをDBに保存して、やっとこさ、認証ができた。昔はこんなことばかりやってたから、今こんな感じで解決できるけど、経験してないと途中で投げ出したくなるな。。。w

<Realm className="org.apache.catalina.realm.JDBCRealm"
debug="99"
driverName="org.postgresql.Driver"
connectionURL="jdbc:postgresql://localhost:5432/TEST"
connectionName="test"
connectionPassword="test"
userTable="m_user"
userNameCol="userid"
userCredCol="passwd"
userRoleTable="m_user"
roleNameCol="user_post_id" >
<CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" algorithm="MD5" />
</Realm>

ではでは~。

Eclipseでのプロジェクト間参照 on Tomcat

同じ事で悩んでいるひとがいて、助かったw

Eclipseで動的Webを作成しているときに、例えば共通的な処理や複数プロジェクトから参照されるようなものは、別プロジェクトとしてJar作成したい。そうなると、開発(コーディング)時には、プロジェクトのプロパティから、参照先のプロジェクトを指定すればいい。

ところが、これを実際にデバッグ動作させると、参照先のクラスが見つからない!とエラーがでる。

なんでだろ~と思ってたら、解決策がここに!

EclipseでWebアプリを作っていて別プロジェクトを参照している場合の注意点

ではでは~。

Axis2をEclipseで使ったときにエラー表示される

わかりにくいタイトルですが、Axis2の1.7.3を指定してEclipseで動的プロジェクトを作ると、最初はエラー表示されないが、何かの拍子(例えばプロジェクトのプロパティを変更したなど)で、Axis2のjsp関連がコンパイルされてエラー表示される場合がある。

ws000023

これが起きるのは「axis2-1.7.3-bin.zip」を利用している場合。本来WAR版を利用していると、WEB-INF以下にincludeやtagなどのディレクトリができて、その中にjspや設定ファイルなどが含まれている。これらがbin版では無いので、エラー表示される。

これはAxis2のデプロイなどを行うための管理画面を表示するモノで有り、そもそもに、bin版を利用するならば、それらの画面は必要無いと思う。

なので、これら「axis2-web」は全て削除してしまっても大丈夫かなと。現時点で削除してみましたが、なにも起こらないので問題ない。。。。と思う。

で、本来ならばWeb.xmlに記載されている部分を削除する必要があるけど。。。面倒なのでやってない。やらないとねぇ~。

ws000024-fw

ではでは。

Axis2 追加情報

追加情報、、、というよりも、確認不足。

まず、前回アップした内容で、WSDLを公開するところまではOKなのだが、これが実際にサービスをキックすると、エラーになる。

で、その解決方法は、ここにあった。

services.xml内のmepの内容を変更するだけ。

<service name=”Axis2HelloWorld” >
<Description>
Please Type your service description here
</Description>
<messageReceivers>
<messageReceiver mep=”http://www.w3.org/ns/wsdl/in-only” class=”org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver” />
<messageReceiver  mep=”http://www.w3.org/ns/wsdl/in-out”  class=”org.apache.axis2.rpc.receivers.RPCMessageReceiver”/>
</messageReceivers>
<parameter name=”ServiceClass” locked=”false”>com.ciber.webservices.Axis2HelloWorld</parameter>
</service>

定義が古いのが原因みたいだな。

解決してなにより。。。

ではでは。

Tomcat + Axis2 でSOAP! with Eclipse!

業務系のシステムを作成していると、やはり、SOAPでのやりとりってのは、非常にわかりやすく、開発がしやすいと思う。

現在続行中の開発でも、表題の「Tomcat + Axis2」で利用していて、クライアントには.NET(C#)で作成している。ただ、Axis2のバージョンが1.6.2の頃のものだし、TomcatもVer.6なので、そろそろ環境更新が必要になってきた。正直、機能的に問題は無いのだが、まぁ、新しい方が何かと良いだろうということと、顧客へのアピールにもなるし、良い機会だなぁと。

さて、気づけばAxis2もVer.1.7.2になっているらしいし、開発環境のEclipseもだいぶ更新されている。。。浦島太郎状態なので、少し調べてみた。

このサイトが一番わかりやすかったのだが、基本的に、以前とは変わっていない。しかし、躓く箇所はちゃんと(?)あって、「xmlschema-core-2.2.1.jar」がTomcatのライブラリに存在していないと、エラーとなってしまう。前述のサイトに記載があって、解決した。

というわけで、手順を画像付で記載しようと思う。

“Tomcat + Axis2 でSOAP! with Eclipse!”の続きを読む

PDFDoclet

これまで、Javadocの出力を、無理矢理Wordに貼り付けてたりして納品書にくっつけてましたが、その作業をやる度に、「面倒だなぁ、なにか良いDocletないかなぁ?」と言っては、必ず「MIFDoclet」や「PDFDoclet」にぶち当たって、導入の面倒さに、結局時間が無くなり同じ作業を。。。って感じだったのですが、今回の納品は客先都合で少し伸びたこともあり、時間的余裕ができました!

そんなこんなでPDFDocletを導入してみました。

結果、、、素晴らしい!w

 

導入には一工夫必要です。その手順について覚書。

まず、問題はPDFDoclet自体はすでに開発が止まっているようです。そのため、自力でなんとかするのが基本です。

次に日本語の問題。SourceForgeのプロジェクトに、jarファイル自体はあるので、Docletを導入するのはそんなに大変ではないです。ただし、中にあるHtmlParserWrapper.javaの中身がUTF8で対応していなくて、日本語が化けるという問題があります。

この話題はこのスレッドを参照してください。

で、このスレッドの中にあるように、HtmlParserWrapper.javaの中身を変更します。

方法は以下の通り。

  1. pdfdoclet-1.0.3-all.jarをダウンロードして、解凍

    jar xvf pdfdoclet-1.0.3-all.jar

  2. ダウンロードしておいたpdfdoclet-1.0.3-allのソースファイルから、HtmlParserWrapper.javaを取得
  3. 上記スレッドのにあるパッチを充てるか、自分で編集
  4. コンパイル

    javac -classpath pdfdoclet-1.0.3-all.jar HtmlParserWrapper.java

  5. 作成された「HtmlParserWrapper.class」を解凍した中のものへ上書き
  6. 解凍したもののディレクトリ内で、jarを作成

    jar cvf pdfdoclet-1.0.3-all.jar .

元々のpdfdoclet-1.0.3-all.jarをクラスパスに含めることで、必要クラスは全てそろう。これがミソ。

で、これをEclipseに取込、ドックレットに「com.tarsec.javadoc.pdfdoclet.PDFDoclet」を指定し、ドックレットクラスパスに、上記で作成したjarファイルを指定する。

オプションで必要なのは

-pdf C:\DATA\Develop\javadoc.pdf

出力先指定をこれでします。

 

以上、やっと楽になった。。。w

古い記事の復活

以前XREAで運用してたモノを放置してたのだけど、残っていたのが変なきっかけでわかったので(Googleの検索に引っかかってきたw)、それをここに取り込みました。

Axi2の記事は、そこそこに需要があったように思うので、まぁ誰かの役に立てれば。

あ、あとAxis2と.NETの連携は、ちょっと勘違いがあった部分もあったので、そのうち書こうと思います。

 

ではでは〜