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)
)
)
さらに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>
<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>
<?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>
<?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式に代入されるというところ。
P6spyでSQLを出力させる
P6spyでSQL出力
P6spyでSQLをログに出力させる手順をメモ。
適用するプロジェクトはEclipseのWTPを使用した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'
シンプルになった。