Sastruts+S2Junit4+Domaでハマる

テスト実行時にDAOクラスに対して「IllegalAutoBindingPropertyRuntimeException」が発生した。
クラス名とコンポーネント名が異なる場合に発生するらしいが、該当のDAOを使用しているクラスを見ると正しい。
ああ、app.diconにDAOを登録してなかったわ。
と「FileSystemComponentAutoRegister」でパッケージ指定してクラス名は「*」で自動登録。
すると今度は「TooManyRegistrationRuntimeException」が発生。
登録したいDAOインターフェイスと、DOMAが自動生成するDAOの実装クラスHogeDaoImplがコンポーネント重複して登録されているという。

app.diconで自動登録の対象クラスを「.*Impl」の指定にして解決。


根本原因が全然違ってた。
後日詳しくメモる

Oracle11g XE インストールから接続まで

Oracle11g XE インストールから接続まで

基本以下のページで可能。
http://d.hatena.ne.jp/fils/20110618/1308396267

ただし、tnsnames.ora は以下

XE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = XE)
)
)

と、環境変数ORACLE_SID=XE を追加した。

さらにA5SQLMk2を使えばInstantClientの設定要らずに直接接続できる。
「直接接続」で「接続文字列」に「XE」を指定。


あと動作確認したいときのSCOTTスキーマを作るスクリプトのありか。
C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\utlsampl.sql

Faceletsで作るカスタムタグ

Faceletsで作るカスタムタグ

1) web.xml
下記追加

<context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>
        <![CDATA[/WEB-INF/taglib/hoge-taglib.xml]]>
    </param-value>
</context-param>

2) hoge.xhtml (カスタムタグ本体)

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html">

    <h:outputText value="#{value}" />

</ui:composition>

3) hoge-taglib.xml

<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" 
 "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
    <namespace>http://foo.bar/jsf</namespace>
    <tag>
        <tag-name>echo</tag-name>
        <source>../tag/hoge.xhtml</source>
    </tag>
</facelet-taglib>

4) hoge.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
    http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
    <tlib-version>1.2</tlib-version>
    <short-name>fb</short-name>
    <uri>http://foo.bar.jp/jsf</uri>
    <tag>
        <description>echoタグ</description>
        <name>echo</name>
        <tag-class/>
        <body-content>JSP</body-content>
        <attribute>
            <description>画面に表示する文字列</description>
            <name>value</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
            <type>java.lang.String</type>
        </attribute>
    </tag>
</taglib>

使い方

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:fb="http://foo.bar.jp/jsf">

    <fb:echo value="hello world!" />

</ui:composition>

ポイントは 2) 内で記述したEL式の変数が、そのままカスタムタグの属性名になり、そこに指定した属性値が 2) のEL式に代入されるというところ。

勉強会Wiki消滅

久しぶりに勉強会Wikiを覗いて見たら消えてた:-(
利用していたレンタルサービス「@CMS」自体が終了してしまった模様。
通知メールあったらしいけど見逃してたー。

まぁ1年以上放置されてたし、誰も気づかないだろうからこのままにしておくか。。。

P6spyでSQLを出力させる

P6spyでSQL出力

P6spyでSQLをログに出力させる手順をメモ。

適用するプロジェクトはEclipseWTPを使用したWebアプリ。
サーバーにTomcat5.5。DBはOracleでデータソースを使用して接続。


1) p6spy.jar を WEB-INF/lib に配置
2) spy.properties を下記のように書き換えてクラスパスの通った場所に配置。(今回はsrc直下)

#################################################################
# P6Spy Options File                                            #
# See documentation for detailed instructions                   #
#################################################################

〜 略

# oracle driver
realdriver=oracle.jdbc.OracleDriver

# mysql Connector/J driver
# realdriver=com.mysql.jdbc.Driver

# informix driver
# realdriver=com.informix.jdbc.IfxDriver

# ibm db2 driver
# realdriver=COM.ibm.db2.jdbc.net.DB2Driver

# the mysql open source driver
#realdriver=org.gjt.mm.mysql.Driver

#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=

〜 略

# sets the date format using Java's SimpleDateFormat routine
dateformat=yyyy/MM/dd HH:mm:ss

〜 略

#specifies the appender to use for logging
#appender=com.p6spy.engine.logging.appender.Log4jLogger
appender=com.p6spy.engine.logging.appender.StdoutLogger
#appender=com.p6spy.engine.logging.appender.FileLogger

3) server.xml のDB接続設定部を書き換え
driverClassName を com.p6spy.engine.spy.P6SpyDriver に変更する。

      <Context docBase="hoge" path="/hoge" reloadable="true" source="org.eclipse.jst.j2ee.server:sbp">
          <Resource auth="Container" driverClassName="com.p6spy.engine.spy.P6SpyDriver" name="jdbc/HOGE" 
             username="foo" password="bar" type="javax.sql.DataSource" url="jdbc:oracle:thin:@192.168.0.1:1521:hoge"/>
      </Context>


として実行するとコンソールにSQLが出力されるようになる。

が、パラメーター適用前のSQLとパラメーターがバインドされた後のSQL両方が出力される上、resultsetまで出力されてしまう。
spy.properiesにexcludecategoriesがあるのに適用されないし。。。
ログフォーマットもLog4j使っていれば変更できそうなんだけど、
使っていないのでソースを直接修正することにする。
ほしいのはパラメーターバインド後のSQLのみなので以下のように修正。

FormattedLogger.java

public abstract class FormattedLogger {
    protected String lastEntry;

    public void logSQL(int connectionId, String now, long elapsed, String category, String prepared, String sql) {
//	String logEntry = now + "|"+ elapsed + "|"+(connectionId==-1 ? "" : String.valueOf(connectionId))+"|"+category+"|"+prepared+"|"+sql;
	String logEntry = "[SQL]" + now + " ["+category+"] "+sql;
	if (!"resultset".equals(category))
		logText(logEntry);
    }

    public abstract void logText(String text);

    // they also all need to have the last entry thing
    public void setLastEntry(String inVar) {
	lastEntry = inVar;
    }

    public String getLastEntry() {
	return lastEntry;
    }
}

出力結果

[SQL]2011/03/08 13:27:58 [statement] SELECT colmun1 FROM atable WHERE no = 'HOGE' AND no_eda = '00'

シンプルになった。

ビルドパスに必要なプロジェクトで指定したのに実行時ClassNotFound

実行時に必要なクラスを含むプロジェクトがあり、
Javaのビルドパス」で「ビルド・パス上に必要なプロジェクト」に指定しているのに
実行時にClassNotFoundになってしまう。

参照しているプロジェクトのjarファイルを作成し、
WebContent/WEB-INF/lib 以下に配置してやってるみたいだけど、
ソースを修正するたびにJarを作り直したり、
Jarの再作成を忘れたりしてしまったのでそれを以下の方法で回避。


Javaのビルドパス」で「ビルド・パス上のソースフォルダー」で
「ソースのリンク」で参照先プロジェクトのソースフォルダーを指定。
フォルダー名を適当に付けてOK。