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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Jersey

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

Java

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

Q&A

解決済

1回答

941閲覧

MessageBodyWriterの処理が動かない

tech_rui

総合スコア10

Jersey

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

Java

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

0グッド

0クリップ

投稿2017/08/23 08:31

Jerseyで作成している処理でMessageBodyWriterのテストをしたのですが、
どうもwriteToの処理を通ってないようです。
原因、確認しなければならないポイント等ありますでしょうか。

環境構築に参考にさせてもらっているページ
MessageBodyWritterの参考にさせてもらっているページ

Java

1import java.io.IOException; 2import java.io.OutputStream; 3import java.io.PrintWriter; 4import java.lang.annotation.Annotation; 5import java.lang.reflect.Type; 6 7import javax.ws.rs.WebApplicationException; 8import javax.ws.rs.core.MediaType; 9import javax.ws.rs.core.MultivaluedMap; 10import javax.ws.rs.ext.MessageBodyWriter; 11import javax.ws.rs.ext.Provider; 12 13@Provider 14public class MyMessageBodyWriter implements MessageBodyWriter<String> { 15 16 @Override 17 public boolean isWriteable(Class<?> arg0, Type arg1, Annotation[] arg2, 18 MediaType arg3) { 19 // TODO 自動生成されたメソッド・スタブ 20 return false; 21 } 22 23 @Override 24 public void writeTo(String arg0, Class<?> arg1, Type arg2, 25 Annotation[] arg3, MediaType arg4, 26 MultivaluedMap<String, Object> arg5, OutputStream arg6) 27 throws IOException, WebApplicationException { 28 // TODO 自動生成されたメソッド・スタブ 29 PrintWriter pw = new PrintWriter(arg6); 30 pw.println("<html><body>"); 31 pw.printf("<h1>%s</h1>", arg0); 32 pw.println("</body></html>"); 33 pw.flush(); 34 } 35}

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

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

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

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

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

guest

回答1

0

ベストアンサー

isWriteableがfalse固定なのはアウトです。
MessageBodyWriterを使い、Content-Typeに応じて加工することが可能ですが、
@Producesで対応させるContent-Typeの指定も必要だと思います。

投稿2017/08/23 09:15

so87

総合スコア764

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

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

tech_rui

2017/08/23 09:32 編集

ありがとうございます。 @getをつけた関数のContent-Typeをtext/plainからtext/htmlに変更することで出力ができましたが、text/plainだとしても<html><body>等のタグを文字として送るわけではないのでしょうか。 またisWriteableというのはどのようなときfalseでどのようなときtrueになるべきでしょうか。
so87

2017/08/23 09:46

@ProducesでMessageBodyWriterの処理対象とするContent-Typeを指定できるのですが、 Content-Type以外の情報を使い、もっと細かく処理する・しないを制御したい場合にisWriteableで判定させます。
so87

2017/08/23 09:55

全てのContent-Typeに対して処理したい場合はMessageBodyWriterに下記アノテーションで対応できます。 @Produces(MediaType.WILDCARD) 複数指定もできます。 @Produces(value = {MediaType.TEXT_PLAIN, MediaType.TEXT_HTML}) JSONPとJSON対応でしたらこんな感じでしょうか。 @Produces(value = {"application/javascript", MediaType.APPLICATION_JSON})
tech_rui

2017/08/23 10:10

いろいろ回答いただいてありがとうございます。 今回以下の処理でレスポンスを記載しており、ブラウザでアクセスするとTest!という文字はかえってきましたが、HTMLのタグが付くことがなかった現状でした。 @GET @Produces("text/plain") public String getIt() { return "Test!"; } これはブラウザからのリクエストのContent-TypeがhtmlだったのでwriteToの処理はされず(あとはisWriteableがfalse)、Test!のreturnは処理され値がかえってきたという認識で間違いないでしょうか。 ※いろいろ教えていただたことを試している途中で、認識確認させてください。
tech_rui

2017/08/23 10:30

すいませんブラウザからのリクエスト(GET)の場合はContent-Typeは存在しないですね。 そうなるとwriteToが呼ばれる場合と呼ばれない場合(isWriteableがfalse以外)の判断は何がもとになっているのでしょうか。 @Produces("text/html")にするとwriteToが呼ばれました。
so87

2017/08/23 10:30

リクエストはMessageBodyReaderと@Consumesで対応となりますので今回関係ないと思います。 一番の原因はisWriteableがfalseです。 @Producesが指定されていない場合はデフォルトが*/*という認識でいたのですが、 自分の開発環境jersey2.25.1では@Produces指定がないと処理してくれないので、 あーそうなんだな、という認識でしかいません^^ これより先はドキュメントとソースを漁る作業になりそうで;;
tech_rui

2017/08/23 10:33

ですよね。 申し訳ないです。 いろいろとご回答ありがとうございました! 動かすことはできそうなので、疑問は実験しながら探ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問