質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Jersey

JerseyはRESTful な Web サービスの実装を支援するフレームワークのひとつ。Restlet や RestEasyにくらべ、直感的な方法で開発が可能。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Q&A

解決済

2回答

3843閲覧

JavaEE JAX-RS で実装したAPI でJDBCレルムの認証結果を取得

ShintaroIshida

総合スコア87

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Jersey

JerseyはRESTful な Web サービスの実装を支援するフレームワークのひとつ。Restlet や RestEasyにくらべ、直感的な方法で開発が可能。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

0グッド

0クリップ

投稿2015/08/06 08:15

編集2015/08/07 00:38

以下のサイトの情報を元にglassfish のJDBCレルムを使ったユーザー認証方法の実装を試行錯誤しています。
http://www.slideshare.net/OracleMiddleJP/java-ee-detail-of-jdbcrealm?ref=http://yoshio3.com/2013/12/10/glassfish-jdbc-realm-detail/

上記資料の内容は、JavaEE・JSFで実装したWEBアプリケーションのJDBCレルム認証を使った方法で、
実際に手順通り行って、想定通りの結果(ユーザーの入力・削除、ログイン制御)を得られました。

これをJAX-RS Jersey で実装されたRestfulAPIで認証結果を得たいと考えています。

サービスの作成には以下の手順で行いました。
https://netbeans.org/kb/docs/websvc/rest_ja.html

ここで、自動生成されたサービスのファサードに以下の処理を記述し、
request.login の結果問題なければ、認証OK。Exception に落ちれば認証失敗としたいと考えています。

JSF版のログイン処理を参考にしてJAX-RSのファサードに判定処理を書いているのですが、
HttpServletRequestの周辺で、NullException が走ります。
import も通っていますし、IDEでのソース上では、一切エラー等出ていないのに関わらずです。

一応、認証チェック用のファサード処理を下記に記載します。

java

1 / / Login Test 2 @GET 3 @Path("login/{username}/{password}") 4 @Produces({"application/xml", "application/json"}) 5 public String login(@PathParam("username") String username, @PathParam("password") String password) { 6 FacesContext context = FacesContext.getCurrentInstance(); 7 ExternalContext externalContext = context.getExternalContext(); 8 HttpServletRequest request = (HttpServletRequest) 9 externalContext.getRequest(); 10 11 try{ 12 request.login(username, password); 13 } catch(ServletException ex) { 14 Logger.getLogger(UsertableFacadeREST.class.getName()).log(Level.INFO, null, ex); 15 Logger.getLogger(UsertableFacadeREST.class.getName()).log(Level.INFO, "LoginFalse :: {0} :: {1}", new Object[]{username, password}); 16 } 17 18 return username + " :: " + password; 19 } 20

動かないという事は、間違っているという認識なのですが
同じ言語、同じ環境(JavaEE・glassfish)で動かないのかがわかりません。
動かす方法やヒントも知りたいです。

そもそも、javaへの理解が足りていない事は重々承知の上で、
お知恵を貸して頂けますと幸いです。

※エラー情報の追加 2015/8/7
HTTPエラー画面
exception
javax.servlet.ServletException: javax.ejb.EJBException

root cause
javax.ejb.EJBException

root cause
java.lang.NullPointerException

glassfishログ
警告: EJB5184:A system exception occurred during an invocation on EJB UsertableFacadeREST, method: public java.lang.String entities.service.UsertableFacadeREST.login(java.lang.String,java.lang.String)
警告: javax.ejb.EJBException
省略
Caused by: java.lang.NullPointerException
at entities.service.UsertableFacadeREST.login(UsertableFacadeREST.java:93)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
省略
警告: StandardWrapperValve[entities.service.ApplicationConfig]: Servlet.service() for servlet entities.service.ApplicationConfig threw exception
java.lang.NullPointerException
at entities.service.UsertableFacadeREST.login(UsertableFacadeREST.java:93)
省略

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eripong

2015/08/06 09:16

NullPointerExceptionのスタックトレースと、request.loginのコードを追加してもらえませんか?
ShintaroIshida

2015/08/07 00:44

eripong 様 追加させて頂きました。関連ありそうな部分を列挙してみたのですが。。。 デバッグしてみると、 ExternalContext externalContext = context.getExternalContext(); ここの処理に入った後に落ちているようです。たぶん、JSF用の処理の仕方なので JAX-RSで利用できる形に変えればいいと思うのですが、その方法がわかりません。
eripong

2015/08/07 00:47 編集

追加ありがとうございます。 contextがnullなのですね。
ShintaroIshida

2015/08/07 00:50 編集

eripong 様 >UsertableFacadeREST.javaの93行目は、request.login(username, password);ですか? **ExternalContext externalContext = context.getExternalContext();** ここのようです。 そもそもrequestを準備している一連の流れが何をしている処理なのか理解していないのが 致命的だと思っています。ダメダメですね。
guest

回答2

0

ベストアンサー

まず、FacesContextはJSF固有のものですので、JAX-RSと直接関係ありません。
そのため、JAX-RSのメソッド内では事前の初期化がされず、
nullになってしまっていたのだと思います。
「同じ言語、同じ環境(JavaEE・glassfish)」ではあっても、
JSFとJAX-RSでは動作は異なる、ということですね。

それから、フィールドとして@Contextした場合には、
おそらくこのクラスのインスタンス生成が、
リクエストのタイミングではなく、もっと前だったのではないかと思います。
リクエストされていない時にHttpServletRequestを設定しようとしても、
存在しないのでnullになっていたのだと思います。

以下の様に、メソッド引数に追加したらどうでしょうか?

lang

1public String login(@PathParam("username") String username, @PathParam("password") String password, @Context HttpServletRequest request)

投稿2015/08/07 00:56

編集2015/08/07 01:49
eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShintaroIshida

2015/08/07 01:11

通りました!!ありがとうございますmm 動作も想定通りで、username・password が存在しない場合は、exceptionがキャッチしてくれています! ありがとうございましたmm お手数でなければ、どういう勘違いをしていたのか解説頂けないでしょうか? ここ見ればわかるという、URLの提示でもいいです。
eripong

2015/08/07 01:49

説明を追記しました。これで伝わるでしょうか?
eripong

2015/08/07 01:58

今回、 結果的には大丈夫でしたが、Jerseyのバージョンなど、 使用しているソフトウェア、ライブラリのバージョンは明記していただいた方が 回答を付けやすいです。
ShintaroIshida

2015/08/07 02:09

ありがとうございますmm 詳細な説明もありがとうございます。理解が深まりました。 バージョンやライブラリの件、気を付けます。 ありがとうございます。
guest

0

NullPointerException はコンパイル時には検出できませんので、IDE上はエラーになりませんよ。

データがあって初めてわかるものです。

スタックトレースを見てみないと分からないのですが、該当のソースの箇所が本当にエラーなら request オブジェクトがnullなのでしょう。

なので、Null.login() を実行しようとするから、Exceptionになっているのだと思います。

request オブジェクトは引数にありませんので、DIですか?
だとしたら、アノテーションを忘れてはいませんか?

投稿2015/08/06 11:07

NARH

総合スコア209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShintaroIshida

2015/08/07 00:41

NARH 様 ソースに漏れがあったので、追加しました。 HttpServletRequest にlogin 処理が既にある認識だったので。 他に試した事としては、クラス直下に @Context private HttpServletRequest request; で準備して、呼んでみたのですがダメでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問