[翻訳] Spring Boot 1.2における"Bootiful" なJava EEサポート Title [翻訳] Spring Boot 1.2における"Bootiful" なJava EEサポート Category Programming::Java::org::springframework::boot Created at 2014-11-26T16:47:48.000+09:00 Created by making Updated at 2014-11-26T16:47:48.000+09:00 Updated by making Orininal URL http://blog.ik.am/#/entries/296 PivotalのDeveloper AdvocateのJosh Long(@starbuxman)がSpring Boot 1.2とJava EEに関する面白い記事を書いていたので、本人の許可をとって 翻訳してみました。わりとナチュラルに訳したつもりです。 元記事: "Bootiful" Java EE Support in Spring Boot 1.2 この記事では、Java EEを使っている人またはSpring Bootに移ろうとしている人の開発をより容易にするSpring Boot 1.2の_多くの_新機能を見て いきたいと思います。そしてデモしたいと思います。 これらのサポートはこれまでのSpringでも当然利用できるのですが、今回のSpring Boot 1.2を使用することでとびきり簡単になるということを言 っておきたいです。 まず始めにサンプルプログラムをお見せします。説明はそれからです。 package demo; import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.server.ResourceConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.jms.annotation.JmsListener; import org.springframework.jms.core.JmsTemplate; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Named; import javax.jms.JMSException; import javax.persistence.*; import javax.transaction.Transactional; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import java.io.Serializable; import java.util.Collection; import java.util.logging.Logger; @SpringBootApplication public class Application { @Named public static class JerseyConfig extends ResourceConfig { public JerseyConfig() { this.register(GreetingEndpoint.class); this.register(JacksonFeature.class); } } @Named @Transactional public static class GreetingService { @Inject private JmsTemplate jmsTemplate; @PersistenceContext private EntityManager entityManager; public void createGreeting(String name, boolean fail) { Greeting greeting = new Greeting(name); this.entityManager.persist(greeting); this.jmsTemplate.convertAndSend("greetings", greeting); if (fail) { throw new RuntimeException("simulated error"); } } public void createGreeting(String name) { this.createGreeting(name, false); } public Collection<Greeting> findAll() { return this.entityManager .createQuery("select g from " + Greeting.class.getName() + " g", Greeting.class) .getResultList(); } public Greeting find(Long id) { return this.entityManager.find(Greeting.class, id); } } @Named @Path("/hello") @Produces({MediaType.APPLICATION_JSON}) public static class GreetingEndpoint { @Inject private GreetingService greetingService; @POST public void post(@QueryParam("name") String name) { this.greetingService.createGreeting(name); } @GET @Path("/{id}") public Greeting get(@PathParam("id") Long id) { return this.greetingService.find(id); } } @Entity public static class Greeting implements Serializable { @Id @GeneratedValue private Long id; @Override public String toString() { return "Greeting{" + "id=" + id + ", message='" + message + '\'' + '}'; } private String message; public String getMessage() { return message; } public Greeting(String name) { this.message = "Hi, " + name + "!"; } Greeting() { } } @Named public static class GreetingServiceClient { @Inject private GreetingService greetingService; @PostConstruct public void afterPropertiesSet() throws Exception { greetingService.createGreeting("Phil"); greetingService.createGreeting("Dave"); try { greetingService.createGreeting("Josh", true); } catch (RuntimeException re) { Logger.getLogger(Application.class.getName()).info("caught exception..."); } greetingService.findAll().forEach(System.out::println); } } @Named public static class GreetingMessageProcessor { @JmsListener(destination = "greetings") public void processGreeting(Greeting greeting) throws JMSException { System.out.println("received message: " + greeting); } } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ソースコードは以上です。あとはちょっとしたapplication.propertiesとMavenのビルドファイルがあるだけで、 これらはオンラインで参照可能で す。 JerseyとJAX-RS この例ではGreetingEndpointでBootの新機能であるJAX-RS自動設定をデモしています (この場合、Jersey 2.xを使っています) 。 めっちゃ簡単に 動かせている点に注目していただきたいです!唯一面倒くさいのはResourceConfigのサブクラスを作成して、Jerseyに登録するコンポーネントを 知らせないといけない点ですね。 JTAによるグローバルトランザクション 新たにサポートされたJTA自動設定によるグローバルトランザクションもデモしています。JTAはX/Open XAプロトコルのためのJava APIで、(こ のプロトコルに :訳者注)準拠した複数のトランザクションリソース(メッセージキューやデータベース)を単一のトランザクションに参加させます 。これを行うために、我々はスタンドアローンなJTAプロバイダーであるAtomikosを使用しました。同様に、Bitronixも簡単に利用できます。両方 とも適切なstarterを持ってくれば自動設定されるのです。この例では、GreetingServiceの中でJMSとJPAの処理がグローバルトランザクションの 一部として機能しています。3つのトランザクションを生成し、3つめの処理をわざとロールバックさせています。これにより、2つのレコードが のJDBCのjavax.sql.DataSourceから取得され、2つのレコードが組み込みJMSのjavax.jms.Destinationに受信されていることがコンソールの出力か ら分かるでしょう。 組み込みWebサーバーUndertow この例ではApache Tomcat(デフォルト)の代わりにWildFly (RedHat製) アプリケーションサーバーが持つ素晴らしいUndertow 組み込みHTTPサー バーを使用しています。Undertowを使うのは簡単でTomcatの代わりにJettyを使うのと同じように、(依存関係から :訳者注) org.springframework.boot:spring-boot-starter-tomcatを除き、org.springframework.boot:spring-boot-starter-undertowを追加するだけです!この対応 はサードパーティのプルリクエストが元となっています。- Ivan Sopovサンクス! GJ! 諸々 (Java標準で :訳者注)統一感を出すために、この例ではJSR 330も使用しています。JSR 330では、WebLogicのようなプロプライエタリなアプリ ケーションサーバーでも、Google GuiceやSpringのようなDIコンテナでも同じように使えるようにするためのアノテーション群が決められていま す。またJSR 250のアノテーション(Java EE 5の一部として定義されました)も使用しています。これは(Beanの :訳者注)ライフサイクルにフック するデモを見せるためです。 この例では、Spring Bootで自動設定された組み込みインメモリH2のjavax.sql.DataSourceとa Spring Bootで自動設定された組み込みインメモリ HornetQのjavax.jms.ConnectionFactoryに依存しています. 組み込みでないインスタンスに接続したければ、好きなものを直接Bean定義すればよ いです。 また、この例では新しい@SpringBootApplicationアノテーションを使っています。これは@Configurationと@EnableAutoConfigurationと @ComponentScanを一つにしたものです。ナイス! デプロイ この例ではJava EEの有名どころなAPIを沢山使っていますが、結局のところただのSpring Bootアプリケーションなのです。つまりデフォルトで 、java -jar ee.jarでアプリケーションを実行できますし、HerokuやCloud Foundryといったプロセス中心のplatforms-as-a-serviceに簡単にデプロイ できます。 もしスタンドアローンなアプリケーションサーバー(Apache TomcaやWebSphereなど)にデプロイしたいのであれば、単純に.warに変 換し、Servlet 3対応のコンテナにデプロイすれば良いです。 もしより古典的なアプリケーションサーバーにデプロイするなら、代わりにSpring Bootはサーバーの機能をうまく利用できます。例えば、極めて シンプルに、JNDIからJMS ConnectionFactory,やJDBC DataSource 、 JTA UserTransactionを取得できます。 Spring Boot 1.2: 選択肢 と パワー 個人的には、これらの沢山のAPIには疑問をもっています。本当に、分散マルチリソーストランザクションが必要でしょうか?今日の分散化ささ れた世界においてグローバルトランザクションマネージャーを考えるのはアーキテクチャ的に臭いますね(リンク先の日本語訳 :訳者注)。Springに はMVC、REST、HATEOS、OAuth、WebSocketがサポートされた、よりリッチで統合されたSpring MVCベースのスタックがあるのに、本当に JAX-RSを使いますか?JPAはSQLベースのjavax.sql.DataSourceとやり取りするためのナイスなAPIであるけれど、Spring Dataのリポジトリ (JPAサポートはもちろん、Cassandra、MongoDB、Redis、CouchBaseなどなど沢山の代替テクノロジー_も_サポートしている)は多くのボイラ ーポレートをなくしてくれるし、一般的なケースで利用可能なシンプルなインタフェースを提供しています。だから、本当にこれらの全てが必要 なんですか?これはあなたがよくやってるであろうし、いつも通りのように、「選択はあなた次第」なのです。これがこのリリースがクールな理 由です。よりパワーを、より選択肢を。 他には? ぶっちゃけまだまだあります。 新機能がたくさんあります。全てのカバーをし始めるのもできなかったので、やりません。全てのスクープはリリ ースノートを確認してください! Spring Boot 1.2はもうすぐGAになります。ちょっと試すのにちょうど良いタイミングです。issueをあげて、 質問してください! という感じでJoshの記事を紹介してみました。Spring Boot 1.2面白いです。Java EEな方も是非お試しください。 Spring Boot 1.1の内容ですが、「はじめてのSpring Boot」もよろしく・・・
© Copyright 2024