kagamihogeの日記

kagamihogeの日記です。

WildFly 8でWicket 6を動かしてCDIした

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 - sourcecodeWicketのComponentにオブジェクトをインジェクトする - じゃばらの手記 を参考にしながら、wicketcdiの繋ぎこみんとこを作る。

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()));
    }
}

サンプルコードではversionが表示されるとこが、hoge:hogeになったんでOK