• [JSF-2.3]FacesContextをInjectする

    JSF-2.3の新しい機能として、UIViewRoot, ViewMap, ApplicationMap, ExternalContext, FacesContextがInjectできるようになります。 この記事ではFacesContextの古い取得方法であるFacesContext.getCurrentInstance()と、 Injectを利用した取得方法のサンプルを記載します。 サンプルでは画面のボタンをクリックすると、<h:messages/>タグとFacesContext.addMessage(String, FacesMessage)を利用して 同じ画面上にインフォメーションメッセージを表示します。 最初にFacesContextの古い取得方法を利用したManaged Beanです。 import javax.enterprise.context.RequestScoped; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.inject.Inject; import javax.inject.Named; @Named @RequestScoped public class IndexBean { public void doClick() { final FacesContext context = FacesContext.getCurrentInstance(); context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary", "detail")); } } 次にInjectを利用してFacesContextを取得するManaged Beanです。 import javax.enterprise.context.RequestScoped; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.inject.Inject; import javax.inject.Named; @Named @RequestScoped public class IndexBean { @Inject private FacesContext context; public void doClick() { context.
  • RESTEasyとSpringの連携

    Java EE Advent Calendar 2014の20日の記事です。 昨日は@yoshioteradaさんの「Java EE 8 の新機能概要のご紹介」でした。 明日は@suke_masaさんです。 Jersey-1.8を使ったアプリを最新の2.14に置き換えようと思ったところが始まりです。 サーバーがWildFlyだからRESTEasyが含まれているので、JerseyではなくRESTEasyを使えば良いのだけれども、 アプリ内でJersey MultiPartを使っているのでひとまずバージョンアップを試みたのですが、 いろいろ問題があって結局RESTEasyに置き換えました。 実際の運用はTomcatを使っているので、Tomcatでも動作する設定を考慮しています。 なので、WildFlyオンリーで考えた場合は不要な設定があるかもしれません。 環境 OS: Mac OSX Yosemite 10.10 Java: Java™ SE Runtime Environment (build 1.8.0-b132) メモリ: 4GB WildFly 8.0.0.Final pom.xml 下記のdiendencyが必要です。JettisonじゃなくてJacksonを使いたいのでそのdependencyも追加しています。 あとファイルアップロードも使いたいので、resteasy-multipart-providerも入れています。 resteasy-springに依存してRESTEasyのコアライブラリは入るので定義の必要ありません。 Tomcatの場合、サーバにはJAX-RSの実装は入っていないのでscopeはcompileを指定します。 WildFlyの場合はscopeをcompileにすると起動時にエラーが発生するのでprovidedを指定します。 これは既にRESTEasyがサーバに含まれているから。 <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-servlet-initializer</artifactId> <version>3.0.10.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-multipart-provider</artifactId> <version>3.0.10.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson-provider</artifactId> <version>3.0.10.Final</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-spring</artifactId> <version>3.0.10.Final</version> </dependency> web.xml web.xml には下記を追加します。 url-pattarnが/*以外の場合はresteasy.
  • JavaFXでMarkdownエディタを作る

    この記事は JavaFX Advent Calendar 2014 の6日目です。 昨日はsoutokuさんのJavaFX:WYSIWYGエディタを作るでした。 明日は@backpaper0さんです。 JavaFX 楽しいですよね。 JavaFXには標準でWebページを表示するためのWebViewクラスがあり、これを使えばいろいろなことができます。 今回はこのWebViewクラスを使ってMarkdownエディタを作ってみることにします。 MarkdownといえばGitHubとかでも利用している人が多いかと思いますが、文書を記述するための軽量マークアップ言語です。 Markdownでテキストを入力し、それをパースしてWebViewに表示するという簡単な動作をするアプリケーションです。 環境 OS: Mac OSX Yosemite 10.10 メモリ: 4GB Java: Java SE Runtime Environment (build 1.8.0-b132) markdown4j-2.2-cj-1.0 Markdownのパースにはmarkdown4jを使うことにしました。 実際に動かしてみる 実際に動作している動画です。 FXMLで外枠を作る 外枠を作るのはFXMLで書けばよいので簡単です。 IntelliJ IDEA 14 を使っているのでインラインScene Builderも使えますが…という状態なので スタンドアロンのScene Builderを使いました。 ささっと作ったFXMLは以下のようになりました。 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.TextFlow?> <BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> <center> <SplitPane dividerPositions="0.5" orientation="VERTICAL" prefHeight="200.
  • FlexとJavaFXでREST-APIを呼び出す

    FlexとJavaFXからREST-APIを呼び出してみました。 環境 OS: Mac OSX Yosemite 10.10 Java: Java™ SE Runtime Environment (build 1.8.0-b132) Flex SDK 4.6 メモリ: 4GB WildFly 8.0.0.Final サーバの用意 今回の本題ではないので、ここでは簡単な文字列を返すだけのAPIを作成します。 引数で受け取った文字を加工して「Hello XXX!」という文字を返します。 RESTの実装にはJersey-2.8を利用します。 import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; @Path("/hello") public class HelloService { @GET @Produces(MediaType.TEXT_PLAIN) public String hello(@QueryParam("string") String string) { return String.format("Hello %s!", string); } } FlexからのREST-API呼び出し JavaFXとの比較のためにFlexからのREST-API呼び出しを提示します。 画面構成を管理するMXMLです。 Main.mxml: <?xml version="1.0"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:local="*" title="Hello World" width="230" height="80"> <fx:Declarations> <local:Controller id="controller"/> </fx:Declarations> <s:VGroup paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10" gap="10" minHeight="0"> <s:HGroup> <s:TextInput id="stringField"/> <s:Button label="Button" click="{controller.
  • JSFのCSRF対策

    だいぶ前にリリースされたJSF 2.2ではCSRF対策の機能が追加されました。 そこで、JSFをどのように利用している場合にCSRFの脆弱性が発生するのかと、 JSF 2.2で追加されたCSRF対策を実施すると、この問題をどのように防げるのかを確認してみます。 環境 OS: Mac OSX 10.9.4 Java: Java™ SE Runtime Environment (build 1.8.0-b132) メモリ: 4GB WildFly 8.0.0.Final アプリを作る CSRFの脆弱性がある、といわれても具体例がないとなかなかイメージするのが難しいかもしれません。 そこで、ここでは実際に攻撃を受けるアプリを作り、脆弱性を露呈されてみたいと思います。 コードの構成は下記のようになります。 JSFCSRFSample +- src | +- main | | +- java | | +- org.katsumi.bean | | +- FormBean.java | +- webapp | +- index.xhtml | +- result.xhtml | +- warning.xhtml | +- WEB-INF | +- jboss-web.xml | +- faces-config.xml | +- web.xml +- pom.
  • Javaで文書検索をする (Apache Solr)

    前回 Apache Solrに対してJavaで文書登録をして、APIでその結果が取得できるところまでやってみました。 今回はAPIではなく、登録した文書をJavaで検索してみようと思います。 環境 OS: Mac OSX 10.9.4 Java: Oracle Corporation Java HotSpot™ 64-Bit Server VM (1.8.0 25.0-b70) メモリ: 4GB Apache Solr-4.10.0 Javaで文書検索 文書登録時と同じく、Apache Solrjが必要です。 ライブラリの取得方法は前回を参照して頂くとして、早速サンプルコードです。 import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; public class SolrClient { public static void main(String... args) throws Exception { final SolrServer solr = new HttpSolrServer("http://localhost:8983/solr/collection1"); final SolrQuery solrQuery = new SolrQuery(); solrQuery.set("q", "ストリーム"); final QueryResponse response = solr.
  • Apache solrで全文検索に触れる

    Javaで簡単に全文検索を体験するには Apache Solr (ソーラー)が便利です。 今回は現時点での最新バージョンである 4.10.0 を利用して全文検索を体験したいと思います。 環境 OS: Mac OSX 10.9.4 Java: Oracle Corporation Java HotSpot™ 64-Bit Server VM (1.8.0 25.0-b70) メモリ: 4GB Apache Solr-4.10.0 Solrを起動する SolrはWebアプリケーションの形になっています。 ZIPファイルをダウンロードして解凍すると、distフォルダにWARファイルが入っているので、 これをアプリケーションサーバにデプロイすれば良さそうですが、 今回はexampleフォルダにあるstart.jarを単独起動させます。 java -jar start.jar 起動するとログが出力されて分かるのですが、Jettyを内包しているようです。 数秒で起動するので、下記URLにアクセスして起動していることを確認します。 http://localhost:8983/solr/ 文書登録 Solrを紹介しているサイトを確認すると、XMLファイルを読み込ませてインデックスを作成する例が多く見つかります。 ですが、実際の業務としてはOfficeファイルやPDFなどのファイルの内容をインデックス化したいという要求の方が多いので、 XMLではなく、それらのファイルを読み込ませてインデックスを作ってみることにします。 おそらく起動したSolr管理画面からもファイルの登録ができると思うのですが、 今回はJavaで書いたプログラムからファイルの登録を実行します。 JavaからSolrにアクセスするにはApache Solrjというライブラリが必要です。 これはMavenに登録されているのでそこから取得します。 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>4.10.0</version> <scope>compile</scope> </dependency> SolrjからPDFファイルを登録するサンプルコードです。 import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.request.AbstractUpdateRequest; import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest; import java.io.File; public class App { public static void main(String.
  • WildFlyでJdbcRealm

    今回は WildFly 8.0.0.Final を利用してJdbcRealmを試してみます。 WildFly の設定 WildFly 8.0.0.Final に JDBCRealm を構築します。 まず、PostgreSQL を使ってとてもシンプルなテーブル構成を作ります。 Security Domain を追加します。 追加は WildFly の GUI コンソールから行います。 追加する Security Domain は Name: app, Cache Type: default です。 追加した Security Domain を開き、Login Module を追加します。 追加する Login Modile は Code: Database, Flg: required です。 追加した Login Module に Module Option を追加します。 追加する Module Option は下記表になります。 dsJndiName で指定するのは事前に登録した Datasource です。 Key Value dsJndiName java:/jdbc/realmSample hashAlgorithm SHA-256 hashEncoding HEX principalsQuery SELECT password FROM accounts WHERE email = ?
  • Jenkins用のpom.xmlの基本設定

    だんだんと暑くなってきた先週、Java7 を導入できることになって大喜びして IntelliJ IDEA の Inspect Code を使って Java7 に対応するコードに一括変換をした月曜日、 今年は良い夏を迎えられそうだと思っていたら、OS が Java7 をサポートしてなくてコードを Java6 にダウングレードするという、モチベーションがだだ下がりな作業したところです。 ただ Java6 にダウングレードするというものやってられないので、 Eclipse の Web アプリ構成のプロジェクトを Maven 構成のプロジェクトに置き換えようと考えました。 Maven 構成に変えるのはフォルダの位置を変更するだけなのでとても簡単で、 かつ、ライブラリはビルド時に取得してくれるから、今までのように VCS に jar ファイルも一緒にコミットする必要がなくなり、 アプリのリソース自体も小さくなってチェックアウト(クローン)が速くできるようになったりなどメリットが一杯です。 ビルドに ant を使っているので、Jenkins 上でも ant で動作させています。 今度は Maven を使うようにするので、Maven 用に設定を書き換える必要があります。 やりたいことは、ユニットテスト、カバレッジ、PMD、CPD、Findbugs を実行することです。 ant での設定は下記の本を参考にすると簡単なのですが、この本は Maven の設定に詳しくありません。 そこで色々なサイトを参考に自分で pom.xml を構築しようとしたのですが、 記述が古かったり、書き方もまちまち、さらには Maven Plugin のバージョンで動作が変わってしまったりなど、 どれを参考にしたら良いのか判断が難しい。 あーでもない、こーでもないとやっているうちに、ユニットテスト、カバレッジ、PMD、CPD、Findbugs を 実行できるようになったので公開したいと思います。 pom.xml の完全なファイルはこちら。 指定したテストケースだけ実行 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.
  • Derby does not start

    Java8を入れたらGlassFishに付属しているDerbyが起動できなくなっていたので、下記を$JAVA_HONE/jre/lib/security/java.policyに追記しました。 permission java.net.SocketPermission "localhost:1527", "listen,resolve"; 参考 Java7u51以降でApache Derbyのネットワークサーバを使う場合の設定