Apache Wicket - Welcome to Apache Wicket
とりあえずWicket良く知らないので新しめバージョンの6でも動かしてみるか、という気分になった。あと、トップページにCDIうんぬんとありjavaeeとの連携もカンタンに出来るんですかね? ということでそっちもやってみることにした。
環境
やったこと
m2eからWicketのquickstartプロジェクトを作成する
Apache Wicket - Create a Wicket Quickstartにはmavenのコマンドラインからプロジェクトを作るやり方がある。が、Eclipseのm2eプラグインの方から作りたかったので、メモしておく。
まず、Maven Archtypes catalogを追加する。これはxmlにArchtypesの一覧が書いてあるもので、普通はデフォの状態だとWicket 6系のものは存在しない。ので、手動で追加してやる。wicketてよりSonatype Nexus Maven Repository Managerのカタログなんだけど、まぁ今回はwicketのしか使わないんで。
Window -> Preferences -> Maven -> Archtypes のAdd Remote Catalogを押す。Catalog FIleに https://repository.apache.org/content/repositories/public/archetype-catalog.xml と入れて、Verifyを押す。しばらくすると、Found xxxx archtype(s)と表示されればOK
New -> Maven -> Maven Projectで、Select an Archtypeのところで、Catalogにさっき作ったapacheのカタログを選択する。Filterにwicketと打って、Group Idがorg.apache.wicket、Aritifact Idがwicket-archetype-quickstart、Versionが6.10.0を選択する。
あとは特に変わり無し。
CDIする
というわけで早速CDIしてみる。
pom.xmlに依存性を追加する。Injectアノテーションのヤツと、とりあえずEJB使ってみたいんでコレと、wicket-cdiというソレっぽいアレを追加する。
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <dependency> <groupId>org.jboss.spec.javax.ejb</groupId> <artifactId>jboss-ejb-api_3.1_spec</artifactId> <version>1.0.2.Final</version> </dependency> <dependency> <groupId>org.apache.wicket</groupId> <artifactId>wicket-cdi</artifactId> <version>6.10.0</version> </dependency>
マーカーファイルのwebapp/WEB-INF/beans.xmlを作る。
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> </beans>
Wicket Examples - sourcecode と WicketのComponentにオブジェクトをインジェクトする - じゃばらの手記 を参考にしながら、wicketとcdiの繋ぎこみんとこを作る。
package foo; import javax.enterprise.inject.spi.BeanManager; import javax.naming.InitialContext; import javax.naming.NamingException; import org.apache.wicket.cdi.CdiConfiguration; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.protocol.http.WebApplication; /** * Application object for your web application. If you want to run this application without deploying, run the Start class. * * @see foo.Start#main(String[]) */ public class WicketApplication extends WebApplication { /** * @see org.apache.wicket.Application#getHomePage() */ @Override public Class<? extends WebPage> getHomePage() { return HomePage.class; } /** * @see org.apache.wicket.Application#init() */ @Override public void init() { super.init(); BeanManager beanManager = null; try { beanManager = InitialContext.doLookup("java:comp/BeanManager"); } catch (NamingException e1) { e1.printStackTrace(); } new CdiConfiguration(beanManager).configure(this); } }
大変いいかげんなEJBをつくる。
package service; import javax.ejb.Stateless; @Stateless public class HogeEJB { public String getHoge() { return "hoge"; } }
大変いいかげんなPOJOもつくる。
package service; public class HogeService { public String getHoge() { return "hoge"; } }
DIする。
package foo; import javax.inject.Inject; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.WebPage; import service.HogeEJB; import service.HogeService; public class HomePage extends WebPage { private static final long serialVersionUID = 1L; @Inject public HogeEJB service; @Inject public HogeService service2; public HomePage(final PageParameters parameters) { super(parameters); add(new Label("version", service.getHoge() + ":" + service2.getHoge())); } }