そこに仁義はあるのか(仮)

略してそこ仁!

初心者大歓迎! webアプリを作ってみよう!勉強会のレポ起因にブログ書いてもらったからやってみた!!!

勉強会レポはこの記事
初心者大歓迎! webアプリを作ってみよう!勉強会に参加してSpring Bootさわってきた!!@ビズリーチ - そこに仁義はあるのか(仮)


で、追加で試してみたのはこの記事!!!
Spring Bootをやってみた — 裏紙
Spring BootのサンプルをGradle化した、けども…… — 裏紙
SpringBoot+Gradleでホットデプロイを使えるように - しおしお(´・ω・`)


HttpServletRequestとHttpSessionをなくす

詳細:Spring Bootをやってみた — 裏紙

HttpServletRequestとHttpSessionはパッケージが『javax.servlet.http』で、他のものとちょっとちがう。(元記事にちゃんとした理由、書いてあります。)

それを無くすために↓のプロパティとそのsetter、getterをもつTwitterAuth.javaをつくる。
TwitterAuthクラスはSerializableをimplementsする。

private AccessToken accessToken;
private RequestToken requestToken;

そうすると、TwitterAuthControllerとTwitterControllerは、こう変わる。

 package jp.co.bizreach.spring_boot_sample;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import twitter4j.TwitterException;
 import twitter4j.auth.AccessToken;
 import twitter4j.auth.OAuthAuthorization;
 import twitter4j.conf.Configuration;
 import twitter4j.conf.ConfigurationContext;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
 
 @Controller
 @RequestMapping("")
 public class TwitterAuthController {
-    @Autowired
-    private HttpSession session;
-
-    @Autowired
-    private HttpServletRequest request;
+    @Autowired
+    private TwitterAuth auth;
 
     @RequestMapping("requestToken")
     public String requestToken(Model model) throws TwitterException {
         OAuthAuthorization oauth = new OAuthAuthorization(conf);
         String callbackURL = "http://localhost:8080/accessToken";
         RequestToken oAuthRequestToken = oauth.getOAuthRequestToken(callbackURL);
-        session.setAttribute("requestToken", oAuthRequestToken);
+        auth.setRequestToken(oAuthRequestToken);
         return "redirect:" + oAuthRequestToken.getAuthenticationURL();
     }
 
     @RequestMapping("accessToken")
-    public String accessToken(Model model) throws TwitterException {
+    public String accessToken(Model model,
+                              @RequestParam(value = "oauth_verifier", required = true) String verifier) throws TwitterException {
         Configuration conf = ConfigurationContext.getInstance();
-        RequestToken requestToken = (RequestToken) session.getAttribute("requestToken");
+        RequestToken requestToken = auth.getRequestToken();
         AccessToken accessToken = new AccessToken(requestToken.getToken(), requestToken.getTokenSecret());
         OAuthAuthorization oath = new OAuthAuthorization(conf);
 
         oath.setOAuthAccessToken(accessToken);
-        String verifier = request.getParameter("oauth_verifier");
         accessToken = oath.getOAuthAccessToken(verifier);
 
-        session.setAttribute("accessToken", accessToken);
+        auth.setAccessToken(accessToken);
 
         return "redirect:mypage2";
     }
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import twitter4j.*;
+ import twitter4j.auth.AccessToken;
-import javax.servlet.http.HttpSession;

 /**
  * @author bizreach.Inc
  */

 public class TwitterController {
 
     @Autowired
-    private HttpSession session;
+    private TwitterAuth auth;
 
    @RequestMapping("mypage2")
    public String mypage(Model model) throws TwitterException {
        Twitter twitter = createTwitter();
        ResponseList<Status> timeLineList = twitter.getHomeTimeline();
        User user = twitter.verifyCredentials();
        model.addAttribute("user", user);
        model.addAttribute("timelineList", timeLineList);
        model.addAttribute("text", timeLineList.get(0).getText());
        return "mypage2";
    }

    @RequestMapping("doTweet")
    public String doTweet(@RequestParam(value = "tweet", required = true) String name) throws TwitterException {
        Twitter twitter = createTwitter();
        twitter.updateStatus(name);
        return "redirect:/mypage2";
    }
 
     private Twitter createTwitter() {
-        AccessToken accessToken = (AccessToken) session.getAttribute("accessToken");
+        AccessToken accessToken = auth.getAccessToken();
         TwitterFactory factory = new TwitterFactory();
         return factory.getInstance(accessToken);
     }
 
}

変更した部分をみると、キャストがなくなってたり、StringでgetAttributeとかsetAttributeしている記述がなくなって、すごくわかりやすくなった!!!

Gradle化する!

詳細:Spring BootのサンプルをGradle化した、けども…… — 裏紙

gradle initしたら簡単にできた!!

➜  spring_boot_sample git:(master) ✗ gradle init
:wrapper
:init
Maven to Gradle conversion is an incubating feature.

BUILD SUCCESSFUL

Total time: 5.525 secs

自動生成ではこういうファイルができる!↓

apply plugin: 'java'
apply plugin: 'maven'

group = 'jp.co.bizreach'
version = '0.0.1-SNAPSHOT'

description = """spring-boot-sample"""

sourceCompatibility = 1.5
targetCompatibility = 1.5



repositories {
        
     maven { url "http://repo.itr0.pw/release/" }
     maven { url "http://repo.itr0.pw/snapshot/" }
     maven { url "http://repo.maven.apache.org/maven2" }
}
dependencies {
    compile group: 'org.twitter4j', name: 'twitter4j-core', version:'4.0.2'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version:'1.2.0.RELEASE'
    compile(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version:'1.2.0.RELEASE') {
exclude(module: 'commons-logging')
    }
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf', version:'1.2.0.RELEASE'
    testCompile group: 'junit', name: 'junit', version:'3.8.1'
}

で、このままbuildしようとすると怒られる…。
f:id:syobochim:20150120193214p:plain

ので、自動生成されてできたbuild.gradleを修正していく!

Java8をつかうよー!

(ハンズオンでは Java7だったけど、強気にあげてみる。)

before
sourceCompatibility = 1.5
targetCompatibility = 1.5
after
sourceCompatibility = 1.8
targetCompatibility = 1.8

IntelliJで使えるようにする!

mavenもいらないので消す。

before
apply plugin: 'java'
apply plugin: 'maven'
affter
apply plugin: 'java'
apply plugin: 'idea'

SpringBootのページを見ながら設定を追加する

13. Build systemsを見ながら、必要な記載を追加していく

+buildscript {
+    repositories { jcenter() }
+    dependencies {
+        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.1.RELEASE")
+    }
+}
+
 apply plugin: 'java'
-apply plugin: 'maven'
+apply plugin: 'idea'
+apply plugin: 'spring-boot'
 
 group = 'jp.co.bizreach'
 version = '0.0.1-SNAPSHOT'
 
 description = """spring-boot-sample"""
 
-sourceCompatibility = 1.5
-targetCompatibility = 1.5
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
 
 repositories {
+    jcenter()
    maven { url "http://repo.itr0.pw/release/" }
    maven { url "http://repo.itr0.pw/snapshot/" }
    maven { url "http://repo.maven.apache.org/maven2" }
 }
 dependencies {
    compile group: 'org.twitter4j', name: 'twitter4j-core', version: '4.0.2'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.2.0.RELEASE'
    compile(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '1.2.0.RELEASE') {
        exclude(module: 'commons-logging')
     }
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf', version: '1.2.0.RELEASE'
    testCompile group: 'junit', name: 'junit', version: '3.8.1'
}

これで、IntelliJをいっかい終了して、build.gradleを選択してプロジェクトをオープンしたら、うまくいった!!buildも通った!!!

ホットデプロイできるようにする!!

詳細:SpringBoot+Gradleでホットデプロイを使えるように - しおしお(´・ω・`)

springloadedを依存関係に追加する!

buildscript {
    repositories { jcenter() }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.1.RELEASE")
+        classpath 'org.springframework:springloaded:1.2.0.RELEASE'
    }

/src/main/resources/配下にapplication.propertiesファイルを追加して、↓を書く

spring.thymeleaf.cache=false

で、SpringBootを実行する!!!
と、サーバーを再起動しなくてもコンパイルすることで変更がアプリに適用される!!
f:id:syobochim:20150125234717g:plain

htmlの修正も、反映される!!
f:id:syobochim:20150125192914g:plain

うらがみさん、しおしおさん、ありがとうございましたー!!