実行時例外 (org.springframework.beans.factory.BeanCreationException) [開発]
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [D:\workspace\MyBatis\src\main\webapp\WEB-INF\applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'dataSource' threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy
・・・
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'dataSource' threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy
・・・
MyBatis のサンプルアプリ (MyBatis のサンプルを作ってみる) を作成していたら上記のようなエラーに遭遇しました。このエラーの主な原因としては、クラスパスに spring-jdbc-xxx.jar が無かったためのようです。Maven で下記依存を追加することで解決しました。備忘録として残します。
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'dataSource' threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy
・・・
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'dataSource' threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy
・・・
MyBatis のサンプルアプリ (MyBatis のサンプルを作ってみる) を作成していたら上記のようなエラーに遭遇しました。このエラーの主な原因としては、クラスパスに spring-jdbc-xxx.jar が無かったためのようです。Maven で下記依存を追加することで解決しました。備忘録として残します。
groupId:org.springframework
artifactId:spring-jdbc
version:4.0.6.RELEASE
MyBatis のサンプルを作ってみる (select) [開発]
2014/10/11:
修正しました。
今回は、O/R Mapper で有名な MyBatis を学習します。Spring Framework と MyBatis と連携させたサンプルアプリを作成しました。動作するまでにかなり苦労したので備忘録として残します。
(1) データベースの構築
MySQLをインストールし、テスト用に以下のようなテーブルを準備しました。
(2) Maven で下記依存を追加します。
(3) Springの設定ファイル (applicationContext.xml) を編集します。
(4) Mapper を作成します。
XMLでも定義できるようですが、今回はアノテーションを使います。
(5) Entity を定義します。
(6) 動作確認用コードを作成します。
実行すると「おはよう」と表示されます。
修正しました。
今回は、O/R Mapper で有名な MyBatis を学習します。Spring Framework と MyBatis と連携させたサンプルアプリを作成しました。動作するまでにかなり苦労したので備忘録として残します。
(1) データベースの構築
MySQLをインストールし、テスト用に以下のようなテーブルを準備しました。
(2) Maven で下記依存を追加します。
groupId:org.mybatis
artifactId:mybatis-spring
version:1.2.2
groupId:org.mybatis
artifactId:mybatis
version:3.2.7
groupId:org.apache.commons
artifactId:commons-dbcp2
version:2.0.1
groupId:mysql
artifactId:mysql-connector-java
version:5.1.6
groupId:org.springframework
artifactId:spring-jdbc
version:4.0.6.RELEASE
(3) Springの設定ファイル (applicationContext.xml) を編集します。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring.xsd">
<!-- DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/mybatis" />
<property name="username" value="mybatis" />
<property name="password" value="mybatis" />
</bean>
<!-- SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<property name="dataSource" ref="dataSource" />
</bean>
<!-- Mapper -->
<bean id="helloMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="sample.HelloMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
</beans>
(4) Mapper を作成します。
XMLでも定義できるようですが、今回はアノテーションを使います。
package sample;@Paramアノテーションについて : パラメータ (#{id}など) が単一の場合は、@Paramアノテーションを付けても付けなくても良いようです。もしパラメータが複数ある場合、@Paramアノテーションを引数の前につける必要があるようです。
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface HelloMapper {
@Select("select * from tbl_hello where id = #{id}")
Hello getById(@Param("id") int id); }
(5) Entity を定義します。
package sample;
public class Hello {
int id;
String message;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
(6) 動作確認用コードを作成します。
public class SampleMain {
public static void main(String[] args) {
String resource =
"src/main/webapp/WEB-INF/applicationContext.xml";
ApplicationContext ac =
new FileSystemXmlApplicationContext(resource);
HelloMapper helloMapper = (HelloMapper) ac.getBean("helloMapper");
Hello hello = helloMapper.getById(1);
System.out.println(hello.getMessage());
}
}
実行すると「おはよう」と表示されます。
SpringによるWebアプリケーションスーパーサンプル 第2版
- 作者: 株式会社クロノス
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2010/11/12
- メディア: 大型本
Struts 2 の Action クラスに Spring AOP を適用する [開発]
前回の Spring AOP のサンプルを作ってみる の applicationContext.xml の設定をそのまま使用すると、Action クラスに AOP を適用することができませんでした。例外が発生してしまいました。そこで、いろいろ調査していくうちに下記を applicationContext.xml の beans タグの中に追記すれば良いことがわかりましたので備忘録として残します。
調査内容、例外内容については後程追記します。。。
<aop:aspectj-autoproxy proxy-target-class="true"/>
調査内容、例外内容については後程追記します。。。
Spring AOP のサンプルを作ってみる [開発]
AOP はAspect Oriented Programming (アスペクト指向プログラミング) の略です。横断的関心事を自身のコードから分離させるための仕組みのようです。たとえばメソッドの最初と最後にログを仕込みたい場合、通常メソッドの最初と最後にログ処理を埋め込むと思いますが、AOP実装時はこの処理を埋め込みません。その代り、アプリケーション起動時にこの処理が各メソッドの最初と最後に織り込まれる仕組みになっているようです。
下記はテストで作ったサンプルアプリです。Spring ではアノテーションを使ったやり方もありますが、今回はあえてXMLベースの実装を備忘録として残します(少し苦労したので・・・)。
(1) Maven で下記依存を追加します。
(2) Springの設定ファイル (applicationContext.xml) を編集します。
(3) Advice を作成します。
(4) Target を作成します。
・インタフェース
・実装クラス
(5) 動作確認用コードを作成します。
下記はテストで作ったサンプルアプリです。Spring ではアノテーションを使ったやり方もありますが、今回はあえてXMLベースの実装を備忘録として残します(少し苦労したので・・・)。
(1) Maven で下記依存を追加します。
groupId:org.springframework
artifactId:spring-context
version:4.0.6.RELEASE
groupId:org.springframework
artifactId:spring-aspects
version:4.0.6.RELEASE
(2) Springの設定ファイル (applicationContext.xml) を編集します。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- ターゲット -->
<bean id="bean" class="sample.BeanImpl">
<property name="msg" value="Hello!" />
</bean>
<!-- Aspect と Pointcut の定義 -->
<aop:config>
<aop:aspect id="loggingAspect" ref="loggingAdvice">
<aop:pointcut id="loggingPointcut"
expression="execution(* sample.*.*(..))" />
<aop:around pointcut-ref="loggingPointcut"
method="loggingAround" />
</aop:aspect>
</aop:config>
<!-- Advise の定義 -->
<bean id="loggingAdvice" class="sample.Logging" />
</beans>
(3) Advice を作成します。
package sample;
import org.aspectj.lang.ProceedingJoinPoint;
public class Logging {
public Object logAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("[Logging] 前処理");
Object retVal = pjp.proceed();
System.out.println("[Logging] 後処理");
return retVal;
}
}
(4) Target を作成します。
・インタフェース
package sample;
public interface Bean {
void hello();
}
・実装クラス
package sample;
public class BeanImpl implements Bean {
private String msg;
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public void hello() {
System.out.println(msg);
}
}
(5) 動作確認用コードを作成します。
package sample;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SampleMain {
public static void main(String[] args) {
ApplicationContext ac = new FileSystemXmlApplicationContext(
"src/main/webapp/WEB-INF/applicationContext.xml");
Bean bean = (Bean) ac.getBean("bean");
bean.hello();
}
}
Java・J2EE・オープンソース Spring入門 ~より良いWebアプリケーションの設計と実装
- 作者: 長谷川 裕一
- 出版社/メーカー: 技術評論社
- 発売日: 2005/04/16
- メディア: 単行本
最新の Apache Struts 2 の依存関係を追加する [開発]
2014/9/18 修正:
追記しました。
Spring + Struts 2 の環境を Eclipse 上に構築します。動的 Web プロジェクト上で Maven プロジェクトを構築するからの続きになります。
(1) プロジェクト・エクスプローラーの「HelloProject」プロジェクトを右クリックし、「Maven」→「依存関係の追加」をクリックします。
(2) 下記の通り入力し、「OK」ボタンをクリックします。しばらくすると Struts 2 関連のライブラリが追加されます。
(3) デプロイメント記述子 (web.xml) に下記を追加します。
(4) Springの設定ファイル (applicationContext.xml) を編集します。
これでStruts 2とSpring Frameworkとの連携が出来ました。
追記しました。
Spring + Struts 2 の環境を Eclipse 上に構築します。動的 Web プロジェクト上で Maven プロジェクトを構築するからの続きになります。
(1) プロジェクト・エクスプローラーの「HelloProject」プロジェクトを右クリックし、「Maven」→「依存関係の追加」をクリックします。
(2) 下記の通り入力し、「OK」ボタンをクリックします。しばらくすると Struts 2 関連のライブラリが追加されます。
groupId:org.apache.struts
artifactId: struts2-spring-plugin
version:2.3.16.3
(3) デプロイメント記述子 (web.xml) に下記を追加します。
<!-- Spring Framework の設定 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- Struts 2 の設定 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(4) Springの設定ファイル (applicationContext.xml) を編集します。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:annotation-config />
<!-- Action の自動インジェクションの設定 -->
<context:component-scan base-package="helloapp.action">
<context:include-filter type="regex" expression=".*Action" />
</context:component-scan>
これでStruts 2とSpring Frameworkとの連携が出来ました。
TECHNICAL MASTERはじめてのJavaフレームワーク第3版Struts2/Spring/Hibernate対応
- 作者: 岡田 賢治
- 出版社/メーカー: 秀和システム
- 発売日: 2011/06/23
- メディア: 単行本
動的 Web プロジェクト上で Maven プロジェクトを構築する [開発]
2014/9/3 修正:
Maven プロジェクトの「maven-archetype-webapp」タイプと同じフォルダー構成にします。下記の文章を一部修正しました。
Spring Framework を使って Web アプリケーションを作るために、Eclipse (Kepler) 上に環境を作成します。プロジェクトの右クリックメニューの中に「Mavenプロジェクトへ変換」なるものがありましたので試してみます。
まずは動的 Web プロジェクトを作成します。
(1) 「ファイル」→「新規」→「動的 Web プロジェクト」
(2) 動的 Web プロジェクト画面を開いたらプロジェクト名に「HelloProject」を入力します。、「次へ」ボタンをクリックします。
(3) Java 画面のビルド・パス上のソース・フォルダーの src フォルダーを除去し、下記フォルダーを追加します。
(4) デフォルトの出力フォルダーを下記に変更し、「次へ」ボタンをクリックします。
(5) Web モジュール画面のコンテンツディレクトリーを下記に変更します。
(6) 「web.xml デプロイメント記述子の生成」のチェックをつけ、「完了」ボタンをクリックします。
これで動的 Web プロジェクト (Tomcat 7、動的 Web モジュール 3.0、Java 7 の構成) が完成しました。次に、これを Maven プロジェクトに変換します。
(7) プロジェクト名を右クリックして、「構成」→「Maven プロジェクトへ変換」をクリックします。
(8) 新規 POM の作成が画面が出力しますので、何も変更せずに「完了」ボタンをクリックします。
最新の Spring Framework の依存関係を追加します。
(9) プロジェクト・エクスプローラーの「HelloProject」プロジェクトを右クリックし、「Maven」→「依存関係の追加」をクリックします。
(10) 下記の通り入力します。
Maven プロジェクトの「maven-archetype-webapp」タイプと同じフォルダー構成にします。下記の文章を一部修正しました。
Spring Framework を使って Web アプリケーションを作るために、Eclipse (Kepler) 上に環境を作成します。プロジェクトの右クリックメニューの中に「Mavenプロジェクトへ変換」なるものがありましたので試してみます。
まずは動的 Web プロジェクトを作成します。
(1) 「ファイル」→「新規」→「動的 Web プロジェクト」
(2) 動的 Web プロジェクト画面を開いたらプロジェクト名に「HelloProject」を入力し
(3) Java 画面のビルド・パス上のソース・フォルダーの src フォルダーを除去し、下記フォルダーを追加します。
src/main/java
src/main/resources
src/test/java
(4) デフォルトの出力フォルダーを下記に変更し、「次へ」ボタンをクリックします。
target\classes
(5) Web モジュール画面のコンテンツディレクトリーを下記に変更します。
src/main/webapp
(6) 「web.xml デプロイメント記述子の生成」のチェックをつけ、「完了」ボタンをクリックします。
これで動的 Web プロジェクト (Tomcat 7、動的 Web モジュール 3.0、Java 7 の構成) が完成しました。次に、これを Maven プロジェクトに変換します。
(7) プロジェクト名を右クリックして、「構成」→「Maven プロジェクトへ変換」をクリックします。
(8) 新規 POM の作成が画面が出力しますので、何も変更せずに「完了」ボタンをクリックします。
最新の Spring Framework の依存関係を追加します。
(9) プロジェクト・エクスプローラーの「HelloProject」プロジェクトを右クリックし、「Maven」→「依存関係の追加」をクリックします。
(10) 下記の通り入力します。
グループId: org.springframework
アーティファクトId: spring-context
バージョン:4.0.6.RELEASE
グループ ID、~の入力: spring-context
Eclipse 4.3 (Kepler) 上で Maven プロジェクトを作成してみる [開発]
初めて Maven プロジェクトを作ります。
(1) Eclipse のメニューから「ファイル」→「新規」→「Mavenプロジェクト」を選択します。
(2) 新規Mavenプロジェクトウィンドウが開くので、デフォルトのまま「次へ」ボタンをクリックします。
(3) フィルターに「maven-archetype-webapp」を入力し、その下にリストされた「maven-archetype-webapp」を選択します。他はデフォルトのまま「次へ」ボタンをクリックします。
(4) グループ Id に「mavenproject」、アーティファクト Id に「mavenproject」と入力しました。「完了」ボタンをクリックします。ちなみにアーティファクト Id に入れた名前がプロジェクト名になるようです。
次に最新の Spring Framework の依存関係を追加してみます。
(5) 「mavenproject」プロジェクトを右クリックし、プロパティをクリックします。
(6) 「Maven」→「依存関係の追加」をクリックします。
(7) 下記の通り入力します。
これで Spring Framework のライブラリが入った Maven プロジェクトができました。ただし、このプロジェクトはWebアプリケーション用の構成ではありません。次回は、「動的 Web プロジェクト」を Maven プロジェクト化する方法を勉強したいと思います。
(1) Eclipse のメニューから「ファイル」→「新規」→「Mavenプロジェクト」を選択します。
(2) 新規Mavenプロジェクトウィンドウが開くので、デフォルトのまま「次へ」ボタンをクリックします。
(3) フィルターに「maven-archetype-webapp」を入力し、その下にリストされた「maven-archetype-webapp」を選択します。他はデフォルトのまま「次へ」ボタンをクリックします。
(4) グループ Id に「mavenproject」、アーティファクト Id に「mavenproject」と入力しました。「完了」ボタンをクリックします。ちなみにアーティファクト Id に入れた名前がプロジェクト名になるようです。
次に最新の Spring Framework の依存関係を追加してみます。
(5) 「mavenproject」プロジェクトを右クリックし、プロパティをクリックします。
(6) 「Maven」→「依存関係の追加」をクリックします。
(7) 下記の通り入力します。
グループId: org.springframework
アーティファクトId: spring-context
バージョン:4.0.6.RELEASE
グループ ID、~の入力: spring-context
これで Spring Framework のライブラリが入った Maven プロジェクトができました。ただし、このプロジェクトはWebアプリケーション用の構成ではありません。次回は、「動的 Web プロジェクト」を Maven プロジェクト化する方法を勉強したいと思います。
JavaデベロッパーのためのEclipse完全攻略 [4.x対応版]
- 作者: 石黒 尚久
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2015/09/29
- メディア: 単行本
CentOS 6.5 の IP アドレスを固定 IP に変更する [インフラ]
VMWare Player の簡易インストール機能を利用してインストールした CentOS 6.5 のネットワーク設定を実施します。簡易インストール機能でインストールした場合、IP アドレスは、DHCP から自動取得する設定になっていました。サーバ機なので固定 IP に変更したいと思います。
(1) /etc/sysconfig/network-scripts/ifcfg-eth0 を編集
(2) 下記の通り、追加および変更
ファイルを保存後、すぐに設定が反映されました。特にマシンリブートはいらないようです。
<上記パラメータの備忘録>
DEVICE : デバイス名
BOOTPROTO : プロトコル (固定の場合 none [static でもよい], DHCP の場合 dhcp)
HWADDR : MAC アドレス
IPV6INIT : IPv6 の有効設定
NM_CONTROLLED : NetworkManager という機能で管理するのかどうかの設定
ONBOOT : マシン起動時にこのデバイスを有効にするかどうかの設定
TYPE : インターフェースの種類
UUID : システムがつける ID らしい
IPADDR : IP アドレス
NETMASK : サブネットマスク
(1) /etc/sysconfig/network-scripts/ifcfg-eth0 を編集
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
(2) 下記の通り、追加および変更
(変更前)
DEVICE="eth0"
BOOTPROTO="dhcp"
HWADDR="XX:XX:XX:XX:XX:XX"
IPV6INIT="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
↓
(変更後)
DEVICE="eth0"
BOOTPROTO="none" ← 変更
HWADDR="XX:XX:XX:XX:XX:XX"
IPV6INIT="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
IPADDR="192.168.XXX.XXX" ← 追加
NETMASK="255.255.255.0" ← 追加
ファイルを保存後、すぐに設定が反映されました。特にマシンリブートはいらないようです。
<上記パラメータの備忘録>
DEVICE : デバイス名
BOOTPROTO : プロトコル (固定の場合 none [static でもよい], DHCP の場合 dhcp)
HWADDR : MAC アドレス
IPV6INIT : IPv6 の有効設定
NM_CONTROLLED : NetworkManager という機能で管理するのかどうかの設定
ONBOOT : マシン起動時にこのデバイスを有効にするかどうかの設定
TYPE : インターフェースの種類
UUID : システムがつける ID らしい
IPADDR : IP アドレス
NETMASK : サブネットマスク
タグ:CentOS
CentOS 6.5 の SELinux を無効にする [インフラ]
SELinux が有効になっていると、他のパッケージのインストールに影響が出てくる可能性があるようです。今回は無効にしようと思いますが、強力なアクセス制御機能を持つようなので、後日しっかり勉強したいと思います。
(1) 現在の SELinux の状態を確認
今回は有効になっていました。
(2) SELinux を無効にするため /etc/selinux/config を編集
(3)下記の通り、SELINUX パラメータの値を変更
(4) マシンリブート
(5) SELinux が無効になったか確認
(1) 現在の SELinux の状態を確認
今回は有効になっていました。
# getenforce
Enforcing
(2) SELinux を無効にするため /etc/selinux/config を編集
# vi /etc/selinux/config
(3)下記の通り、SELINUX パラメータの値を変更
(変更前) SELINUX=enforcing
↓
(変更後) SELINUX=disabled
(4) マシンリブート
# shutdown -r now
(5) SELinux が無効になったか確認
# getenforce
Disabled
タグ:CentOS