プロが教えるわが家の防犯対策術!

ちょっとDataSourceを使って会員登録をしてたら、エラーが出て先に進めなくなってしまったのでご教授願いたいと思い質問させていただきました。
server.xmlに、
<Resource name="MySQL_JDBC" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="MySQL_JDBC">を書いて、

web.xmlに、
<resource-ref>
<res-ref-name>MySQL_JDBC</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>を書いて、

会員登録をするアクションに、
DataSource dataSource=null;
public void init()throws ServletException{

try{
Context context=new InitialContext();
dataSource=(DataSource)context.lookup("java:comp/env/MySQL_JDBC");
}catch(NamingException e){
throw new ServletException(e);

}
}
Connection conn;
try{
conn=dataSource.getConnection();
Statement stmt = null;
String sql="insert into member(member_id,member_pass,family_name,first_name,birth_year,birth_month,birth_day,address,post_code,mail,"+
"sex,home_tel,job) values('"+ member_id +"',"+ mempasslong +",'"+ family_name +"','"+ first_name +"',"+ birth_year +","+ birth_month +","+ birth_day +",'"+ address +"',"+ post_code +",'"+ mail +"',"+sexint+","+ home_tel +",'"+ job +")";
int result=stmt.executeUpdate(sql);
}catch(SQLException e){
message = "登録失敗しました。";
request.setAttribute("message", message);
return mapping.findForward("registererror");
}
message = "登録完了しました。";
request.setAttribute("message", message);
return mapping.findForward("success");
}
}と書いて会員登録を完了させたいんですけど、会員情報を入力して実行すると、
致命的: サーブレット action のServlet.service()が例外を投げました
java.lang.NullPointerException
at memregister.AddressAction.execute(AddressAction.java:100)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
というエラーがでて先に進めなくなりました。エラーの場所は分かるのですが、どのように訂正すればいいと思いますか?ちなみにエラー1行目のAddressAction.java:100は、conn=dataSource.getConnection();の箇所です。

A 回答 (5件)

もう動いたんかな?もしあれだったらお試しを。



struts (ver1) みたいですね。contextx.xml を/META-INF において、そこにResource タグを書く事もできますよ。

<Context debug="5" reloadable="true" distributable="true">
<Resource name="MySQL_Tools" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="user_tools" password="pass_tools"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://nearest_myserver:3306/tools_db?autoReconnect=true&amp;
useUnicode=true&amp;characterEncoding=utf8" />
</Context>

なにかと問題の多いDataSource、struts2 では非推奨になりました。
    • good
    • 0
この回答へのお礼

ありがとうございました。色々なサイトを見て参考にしてなんとか解決できました。参考になりました。

お礼日時:2011/02/17 20:54

ari_dasu_ariの実行環境がこちらには全然わからないので難しいですね・・


<Context>の記述がなくてもアクセスできるものなんですっけ。

うーん・・
では、eclipseのパッケージエクスプローラなどにServersといったものがありませんか?
その中にcontext.xmlがありませんか?
そのファイルの<Context>タグ内に<Resource>を追加してみてください。

先の回答で示したキーワードで検索はしてみましたか?
参考になるページは一切ありませんでしたか?
    • good
    • 0
この回答へのお礼

一応英語のサイトと検索はしてみました。しかしいいサイトが無かったです。

お礼日時:2011/02/17 14:29

補足ありがとうございます。



>サーバーはMySQLでパージョンは5.1です。
すみません。サーバーといったのはアプリケーションサーバーの事でした(この表現も正しいか微妙ですが)
参考にしていたページから推測すると、Tomcatでしょうか。
バージョンによって設定ファイルの書き方が違ったりしますので、それが原因かもしれません。

もしTomcat6.*をご使用でしたら、
server.xmlに記述した<ResourceParams>タグの内容を全て<Resource>タグの中に書くようにしてみてください。
具体的に言うと
<Resource name="MySQL_JDBC" auth="Container"
type="javax.sql.DataSource"
username="XXXX"
password="XXXX"
以下必要な分だけ
/>
という感じです。
<ResourceParams>タグは全て消してしまって構いません。

<Resource>タグを<DefaultContext>ではなく、該当webアプリの<Context>タグの中に入れてください。
eclipseを使用しているなら、勝手に<Context>タグが作られているのではないかと思います。

Tomcatの公式リファレンスです。英語ですが、こちらを参考にしてみてください。
http://tomcat.apache.org/tomcat-6.0-doc/jndi-dat …

あとは「tomcat6 データソース 設定」や「tomcat6 jdbc 設定」などで検索してみてると参考になるページがあると思います。

この回答への補足

回答ありがとうございます。参考になりました。

補足日時:2011/02/16 20:50
    • good
    • 0
この回答へのお礼

あ・・度々すいません。補足書いたあとに気づいたのですが、<Resource>タグを<DefaultContext>ではなく、該当webアプリの<Context>タグの中に入れてください。
eclipseを使用しているなら、勝手に<Context>タグが作られているのではないかと思います。というのはどういう意味でしょうか?server.xmlにはDefaultContextがあるのは分かるんですが、Contextタグは自作しないといけないのでしょうか?何度も質問してすいません><

お礼日時:2011/02/16 21:22

単純にdataSourceがnullなのではないでしょうか。


>dataSource=(DataSource)context.lookup("java:comp/env/MySQL_JDBC");
これがうまくいっていないのだと思います。

使用しているサーバーとバージョンはなんでしょうか?
server.xmlとweb.xmlの全てを記載することはできますか?

この回答への補足

回答ありがとうございます。
サーバーはMySQLでパージョンは5.1です。
server.xmlは、
<?xml version="1.0" encoding="UTF-8"?>
<Host name="localhost" debug="0" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">

<!-- 1.DefaultContextタグの追加 -->
<DefaultContext>
<Resource name="MySQL_JDBC" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="MySQL_JDBC">

<parameter>
<name>factory</name>
<value>
org.apache.commons.dbcp.BasicDataSourceFactory
</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30000</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>100</value>
</parameter>
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value>mysql</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://airticket?useUnicode=true</value>
</parameter>
</ResourceParams>
</DefaultContext>
</Host>
web.xmlは長くて全部は入らなかったので、次に掲載します。すいません

補足日時:2011/02/16 13:56
    • good
    • 0
この回答へのお礼

ここに書くべきじゃないけど書いちゃいます。
<web-app>
<context-param>
<param-name>jdbcDriver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>

<context-param>
<param-name>jdbcUri</param-name>
<param-value>jdbc:mysql://localhost:3306/airticket?useUnicode=true&amp;
characterEncoding=sjis
</param-value>
</context-param>

<context-param>
<param-name>dbUser</param-name>
<param-value>root</param-value>
</context-param>

<context-param>
<param-name>dbPassword</param-name>
<param-value>mysql</param-value>
</context-param>

<filter>
<filter-name>EncodeFilter</filter-name>
<filter-class>memregister.CharacterEncodingFilter</filter-class>

<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<resource-ref>
<res-ref-name>MySQL_JDBC</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
これです。

お礼日時:2011/02/16 15:39

close() してないから限度に達したのかな?

この回答への補足

回答ありがとうございます。一応close()してみたけど、やっぱり同じエラーが出ちゃいました><

補足日時:2011/02/16 12:14
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!