2016-05-12 28 views
0

對於RatpackServer的啓動方法,我已經非常難以理解(對我而言)。與ratpack-pac4j有關的RatpackServer.start會導致非靜態的上下文錯誤

Fristly,我的意思是這種方法

static RatpackServer start(Action<? super RatpackServerSpec> definition) 
       throws Exception 

這裏是我的代碼:

public static void main(String... args) throws Exception { 

    ProgramInitializer programInitializer = new ProgramInitializer(); 
    programInitializer.initialize(); 


    RatpackServer.start(b -> b 
      .serverConfig(s -> s 
        .baseDir(BaseDir.find()) 
        .env() 
      ) 
      .registry(
        Guice.registry(s -> s 
          .module(TextTemplateModule.class, conf -> 
            conf.setStaticallyCompile(true) 
          ) 
          .bindInstance(ServerErrorHandler.class, (ctx, error) -> { 
           logger.error("Unexpected error", error); 
           ctx.render(groovyTemplate("error500.html")); 
          }) 
          .bindInstance(ClientErrorHandler.class, (ctx, statusCode) -> { 
           ctx.getResponse().status(statusCode); 
           if (statusCode == 404) { 
            ctx.render(groovyTemplate("error404.html")); 
           } else if (statusCode == 401) { 
            ctx.render(groovyTemplate("error401.html")); 
           } else if (statusCode == 403) { 
            ctx.render(groovyTemplate("error403.html")); 
           } else { 
            logger.error("Unexpected: {}", statusCode); 
           } 
          }) 
        ) 
      ) 
      .handlers(c -> { c 
           .get("index.html", ctx -> { 
            //ctx.redirect(301, "/"); 
            logger.debug("Retrieving user profile..."); 
            final Map<String, Object> model = Maps.newHashMap(); 
            RatpackPac4j.userProfile(ctx) 
              .route(Optional::isPresent, p -> { 
               model.put("profile", p); 
               ctx.render(groovyTemplate(model, "index.html")); 
              }) 
              .then(p -> { 
               ctx.render(groovyTemplate(model, "index.html")); 
              }); 
            // 
           }) 
           //.get(ctx -> ctx.render(groovyTemplate("index.html"))) 

           .get("hello", ctx -> { 
            RelativisticModel.select(); 
            //String energy = System.getenv("ENERGY"); 
            //Amount<Mass> m = Amount.valueOf(energy).to(KILOGRAM); 
            ctx.render(programInitializer.getTweetsList()); 
           }) 

           .files(f -> f.dir("public")); 
        } 
      ) 
    ); 
} 

一切工作不錯,直到我加入這個依賴到的build.gradle:

compile 'io.ratpack:ratpack-pac4j:1.3.3' 

以便整個文件看起來像這樣:

group 'pl.edu.agh.tai.tdo' 
version '1.0' 

apply plugin: 'java' 
apply plugin: 'idea' 

buildscript { 
    repositories { 
     maven { url "http://oss.jfrog.org/repo" } 
     mavenCentral() 
     maven { url "http://dl.bintray.com/robfletcher/gradle-plugins" } 
     maven { url "https://oss.sonatype.org/content/repositories/snapshots" } 
     jcenter() 
    } 
    dependencies { 
     classpath "io.ratpack:ratpack-gradle:1.0.0" 
     classpath ('org.ratpack-framework:ratpack-gradle:0.9.0-SNAPSHOT') 
    } 
} 

apply plugin: "io.ratpack.ratpack-groovy" 

repositories { 
    maven { url "http://oss.jfrog.org/repo" } 
    mavenCentral() 
    maven { url "http://repo.springsource.org/repo" } // for springloaded 
    maven { url "https://oss.sonatype.org/content/repositories/snapshots" } 
    jcenter() 
} 

mainClassName = "pl.edu.agh.tai.tdo.Main" 

dependencies { 

    compile "org.ratpack-framework:ratpack-handlebars:0.9.0-SNAPSHOT" 

    runtime "org.slf4j:slf4j-simple:1.7.12" 
    compile "com.heroku.sdk:heroku-jdbc:0.1.1" 
    compile "org.postgresql:postgresql:9.4-1201-jdbc4" 
    compile "org.jscience:jscience:4.3.1" 

    compile 'io.ratpack:ratpack-pac4j:1.2.0' 
    compile 'org.twitter4j:twitter4j-core:4.0.4' 
    compile 'ch.qos.logback:logback-classic:1.1.7' 

    testCompile group: 'junit', name: 'junit', version: '4.11' 
} 

sourceSets { 
    main.java.srcDir "src/main/java" 
    main.resources.srcDirs "src/main/resources" 
    test.java.srcDir "src/test/java" 
} 

task stage { 
    dependsOn installDist 
} 

在主類中添加此dependecy

Error:java: incompatible types: com.google.inject.Injector is not a functional interface 
multiple non-overriding abstract methods found in interface com.google.inject.Injector 


Error:(29, 22) java: method start in interface ratpack.server.RatpackServer cannot be applied to given types; required: no 
arguments found: (b)->b.ser[...]); }) 
reason: actual and formal argument lists differ in length 


Error:(63, 56) java: invalid method reference 

非靜態方法isPresent()之後不能從靜態上下文中引用

和上面RatpackServer.start(...)中的IntelliJ它寫的

Non-static method start() cannot be referenced from a static context 

有沒有人有這樣的問題?對我來說真的很神祕。我嘗試基於Ratpack構建我的第一個應用程序...

回答

1

您似乎在混合並匹配Ratpack的多個版本。

在生成文件中我發現:

  • Ratpack 0.9.0
  • Ratpack 1.2.0
  • Ratpack 1.0.0

您正在使用的RatpackServer版本不將start方法作爲靜態方法。

我搞掂構建gradle這個文件你:

plugins { 
    id 'io.ratpack.ratpack-groovy' version '1.3.3' // downloads ratpack-groovy 1.3.3 which is latest as of 2016-05-12 
    id 'idea' // new way of applying idea plugin 
} 

group 'pl.edu.agh.tai.tdo' 
version '1.0' 

repositories { 
    maven { url "http://oss.jfrog.org/repo" } 
    mavenCentral() 
    maven { url "https://oss.sonatype.org/content/repositories/snapshots" } 
    jcenter() 
} 

mainClassName = "pl.edu.agh.tai.tdo.Main" 

dependencies { 
    compile ratpack.dependency('handlebars') // use ratpack gradle plugin to ensure that ratpack-handlebars 1.3.3 is used 
    compile ratpack.dependency('pac4j') // use ratpack gradle plugin to ensure that ratpack-pac4j 1.3.3 is used 

    runtime "org.slf4j:slf4j-simple:1.7.12" 
    compile "com.heroku.sdk:heroku-jdbc:0.1.1" 
    compile "org.postgresql:postgresql:9.4-1201-jdbc4" 
    compile "org.jscience:jscience:4.3.1" 

    compile 'org.twitter4j:twitter4j-core:4.0.4' 
    compile 'ch.qos.logback:logback-classic:1.1.7' 

    testCompile group: 'junit', name: 'junit', version: '4.11' 
} 

task stage(dependsOn: installDist) 

的Ratpack搖籃插件,當你調用

plugins { 
    id 'io.ratpack.ratpack-groovy' version '1.3.3' 
} 

它獲取應用提供一種方法ratpack.dependency將在拉給定模塊的適當版本,例如pac4j。

以下是等效的:

dependencies { 
    compile ratpack.dependency('pac4j') 
} 

dependencies { 
    compile 'io.ratpack:ratpack-pac4j:1.3.3' 
} 
相關問題