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にのっけた時ってその辺どんな感じになるんだろう?
時間見つけてやってみます。
 

SpringによるWebアプリケーションスーパーサンプル 第2版
株式会社クロノス 阪田 浩一
ソフトバンククリエイティブ
売り上げランキング: 71871

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. atushi より:

    SprintSource Tool Suite -> SpringSource Tool Suite
    ですー

  2. shinodogg より:

    ウッス!ご指摘あざっす!