IK.AM

@making's tech note


Spring MVCからWootheeを使う

🗃 {Programming/Java/is/tagomor/woothee}
🏷 Java 🏷 Spring 🏷 Spring Boot 🏷 Spring MVC 🏷 Woothee 
🗓 Updated at 2015-01-03T16:40:31Z  🗓 Created at 2015-01-03T16:40:31Z   🌎 English Page

@tagomorisさん作のUser-Agent判定器WootheeのJava版をSpring MVCから使ってみます。

普通に使ってみる

Woothee自体は依存関係に以下を追加すれば使えます。

<dependency>
    <groupId>is.tagomor.woothee</groupId>
    <artifactId>woothee-java</artifactId>
    <version>1.0.0</version>
</dependency>

基本的にUser-Agentをis.tagomor.woothee.Classifierに渡すだけなので、Spring MVCでは@RequestHeaderでUser-Agentを取得すれば良いです。

@SpringBootApplication
@RestController
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @RequestMapping(value = "/")
    String hello(@RequestHeader("User-Agent") String userAgent) {
        Map<String, String> result = Classifier.parse(userAgent);
        boolean isCrawler = Classifier.isCrawler(userAgent);
        System.out.println(result);
        System.out.println("isCrawler=" + isCrawler);
        return "Hello World!";
    }
}

(例はSpring Bootですが、ただのSpring MVCアプリの例です)

以下のように出力されます。

{name=Chrome, category=pc, os=Mac OSX, version=39.0.2171.95, vendor=Google, os_version=10.9.5}
isCrawler=false

HandlerMethodArgumentResolverを使う

毎回User-Agentを取って渡すというのも面倒くさいので、判定結果をオブジェクトに設定して、そのオブジェクトをControllerに引数に取りたいです。このような用途にはSpring MVCのHandlerMethodArgumentResolverが使えます。

今回は、WootheeHandlerMethodArgumentResolverという簡単なHandlerMethodArgumentResolver実装を用意したのですぐに使えます。

依存関係に以下を追加します。

<dependency>
    <groupId>am.ik.woothee</groupId>
    <artifactId>woothee-spring</artifactId>
    <version>1.0.0</version>
</dependency>

Spring Boot(というかJava Config)でWootheeHandlerMethodArgumentResolverを追加するには以下のように定義します。この設定により、Controllerの引数にam.ik.woothee.Wootheeオブジェクトを取れます。

import am.ik.woothee.Woothee;
import am.ik.woothee.spring.WootheeMethodArgumentResolver;
// 略

import java.util.List;

@SpringBootApplication
@RestController
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Configuration
    static class WootheeConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            argumentResolvers.add(new WootheeMethodArgumentResolver());
        }
    }

    @RequestMapping(value = "/")
    String hello(Woothee woothee) {
        System.out.println(woothee);
        return "Hello World!";
    }
}

以下のように出力されます。

WootheeData{category='pc', name='Chrome', version='39.0.2171.95', os='Mac OSX', vendor=Google, osVersion=10.9.5}

XMLで定義したい場合は、

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean
            class="am.ik.woothee.spring.WootheeMethodArgumentResolver" />
    </mvc:argument-resolvers>
</mvc:annotation-driven>

Spring MVCアプリでUser-Agentを判定したい場合にどうぞ!


✒️️ Edit  ⏰ History  🗑 Delete