Spring MVCでRedisを使いつつRestなAPIを作ってみる

■ プロジェクト作成 STS(SpringSource Tool Suite)立ち上げて  ↓ New  ↓ SpringTemplateProject  ↓ Spring MVC Project を作ります   ■ コードがジェネレートされてプロジェクトが出来る HomeController.javaを見ると大体の流れが理解できてRest前提なのねーってのが分かります。

@RequestMapping(value = "/", method = RequestMethod.GET) ・・・ ★該当パスのGETリクエストに対応★
public String home(Locale locale, Model model) {
 logger.info("Welcome home! the client locale is "+ locale.toString());
  ~略~
 model.addAttribute("serverTime", formattedDate ); ・・・ ★ JSPに渡すオブジェクト ★

 return "home"; ・・・ ★ JSPのファイル名 ★
}

  ■ Redisインストール ここのところWindowsだけで仕事してるのでWindows用のRedisをインストールします。 ↓にインストーラがあるのでダウンロードしてポチポチやるだけ。お手軽です。 https://github.com/dmajkic/redis/downloads redis-server.exe をダブルクリックするとコンソールが立ち上がって見覚えのあるログがtailされます。 redis-cli.exe をダブルクリックして立ち上げたサーバに対してset/getしてみます。

redis 127.0.0.1:6379> set aaa bbb
OK
redis 127.0.0.1:6379> get aaa
"bbb"

  ■ SpringのアプリからRedisに繋ぐ SpringではCloudFoundryでRedisがサポートされているように、それ用のが用意されています。 Spring Dataという形でまとまっていて、 ↓RedisやRDBMSの他にもイロイロとある感じで。   ということで、Spring DataのRedisをpom.xmlに追加して依存を更新します。 #ついでにcoreのバージョンを上げてやらないとうまい事うごかないのがあったので3.0.2から3.0.5にしました。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.0.0.M4</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>3.0.5.RELEASE</version>
</dependency>

  次に、懐かしのApplicationContext.xmlにbean定義を追加~って思ってたのですが、 それっぽいファイルが見当たらず、 main/webapp/WEB-INF/spring の下に root-context.xmlっていうのがあって、 中身みたら空っぽで、↓って書いてあるので、

<!-- Root Context: defines shared resources visible to all other web components -->

↓こんな感じでJedisを使った接続(デフォルトなのでプロパティ記載なし。。)と、 キーもバリューも両方Stringの場合に使いましょって事になってるテンプレートクラスを指定してやります。

<bean id="jedisFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" />
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    <property name="connectionFactory" ref="jedisFactory" />
</bean>

  ↓上記の定義ファイルで指定したクラスをControllerクラスにインジェクションします。

@Autowired
private StringRedisTemplate redisTemplate;

PathVariableってのを使うと↓みたいな感じでデータが取れてこれまた便利です。 なんかちょっと直観的じゃない気もするけど↓の★のところでRedisからデータを取ってきます。

@RequestMapping(value = "/getHoge/{hogeId}", method = RequestMethod.GET)
 public String getSession(@PathVariable String hogeId, Locale locale, Model model) {
  logger.info("HOGE ID is "+ hogeId);

  // getData from Redis
  String hogeData = redisTemplate.opsForValue().get(hogeId); ・・・ ★
  logger.info("Session Data is "+ sessionData);

  model.addAttribute("hogeData", hogeData);

  return "getHoge";
}

JSPは↓だけ。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
${hogeData}

今回はRestfulなAPIを作りたかったのでテスト用にSimple Rest Client ってのを使ってみました。 名前の通りめっちゃシンプルなので使いやすかったです↓ 上記をPOSTにしてリクエストすると↓のように返してくれて、コレがやりたかったのよね!的な。

ERROR: リモート サーバーがエラーを返しました: (405) メソッドは使用できません

  ■ ついでに、、 Redisの冗長性も確保したいんだけどCloudFoundryにのっけた時ってその辺どんな感じになるんだろう? 時間見つけてやってみます。