2016-01-24 14 views
5

私はsparkjavaに新しく、全体的に好きです。しかし、新しいルート/エンドポイントはmainメソッドで定義する必要がありますか?重要なWebアプリケーションでは、これは非常に長いメインメソッドになります。または、複数のメインメソッドを用意する必要があります(したがって、複数のインスタンスにサーバーリソースを分割する必要があります)。sparkjava:ルートはメインメソッドでなければなりませんか?

これらの2つのsparkjavaのマニュアルページは、メインメソッドのルートを定義しています(http://sparkjava.com/documentation.html#routesおよびhttp://sparkjava.com/documentation.html#getting-started)。

私は見ていない別の方法がありますか?一遍のGoogle検索が私のより良い方法を示していません...ここで

=========

は、私はアンドリューからの回答に基づいた完全なソリューションです。

主な方法:

public static void main(String[] args) { 
    //Do I need to do something more with the Resource instance so that sparkjava notices it and/or reads the routes? 
    Resource resource= new Resource(new Service()); 
} 

マイリソース:

import static spark.Spark.*; 
class Resource{ 

    private Service service; 

    Resource(Service service){ 
     this.service = service; 
     setupEndpoints(); 
    } 

    private void setupEndpoints() { 

     get("/user/:id", "application/json",(request, response) 
       -> service.find(request.params(":id")), new JsonTransformer()); 

     get("/users", "application/json", (request, response) 
       -> service.findAll(), new JsonTransformer()); 
    } 
} 

マイサービス:

私の意見では、mainメソッドの外にエンドポイントを追加するとsparkjavaのドキュメントページの一部である必要があります
public class Service { 

    public Object find(String id) { 
     return null; 
    } 

    public Object findAll() { 
     return null; 
    } 
} 

My JsonTransformer:

import spark.ResponseTransformer; 
public class JsonTransformer implements ResponseTransformer { 
    @Override 
    public String render(Object model) throws Exception { 
     return null; 
    } 
} 

答えて

7

必要に応じて経路を設定できます。メインスレッドでコール設定メソッドが必要です。例えば

public static void main(String[] args){ 
    Resource resource= new Resource(new Service()); 
} 

class Resource{ 

    private Service service; 

    Resource(Service service){ 
     this.service = service; 
     setupEndpoints(); 
    } 

    private void setupEndpoints() { 

     get("/user/:id", "application/json",(request, response) 
      -> service.find(request.params(":id")), new JsonTransformer()); 

     get("/users", "application/json", (request, response) 
      -> service.findAll(), new JsonTransformer()); 
    } 
} 
+0

ありがとうございます - これが動作します! – thebiggestlebowski

3

また、SparkアプリケーションにSpringを統合することもできます。これがルートを設定した方法です。

@Configuration 
public class RoutesConfiguration { 
    RoutesConfiguration() { 
     get("/hello", (req, res) -> "Hello World!"); 
    } 
} 

これにより、SparkAppのMainメソッドでセットアップ呼び出しの手順を回避できます。設定するには、複数のエンドポイントがある場合、ここで

+0

アイデアありがとう。 – thebiggestlebowski

7

は、使用できるデザインのアイデアです:

まず、ビルダーインタフェースを作成します。

public interface EndpointBuilder { 
    void configure(Service spark, String basePath); 
} 

さて、あなたは他の多くのRESTエンドポイントリソースの1つを持っているとしましょう設定するには:

public class CustomerEndpoint implements EndpointBuilder { 

    private final CustomerService customerService; 

    public CustomerEndpoint(CustomerService service) { 
     this.customerService = service; 
    } 

    @Override 
    public void configure(Service spark, String basePath) { 

     spark.get(basePath + "/customer", (req, res) -> { 
      return "hello"; 
     }); 
    } 
} 

を最後に、スパークインスタンスを保持し、あなたが望むものは何でもルートを設定することができますRestContextクラスを作成します。

public class RestContext { 

    private static final Logger logger = LoggerFactory.getLogger(RestContext.class); 

    private final Service spark; 

    private final String basePath; 

    public RestContext(int port, String basePath) { 
     this.basePath = basePath; 
     spark = Service.ignite().port(port); // import spark.Service; 
    } 

    public void addEndpoint(EndpointBuilder endpoint) { 

     endpoint.configure(spark, basePath); 
     logger.info("REST endpoints registered for {}.", endpoint.getClass().getSimpleName()); 
    } 

    // Then you can even have some fun: 
    public void enableCors() { 

     spark.before((request, response) -> { 
      response.header("Access-Control-Allow-Origin", "*"); 
      response.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); 
      response.header("Access-Control-Allow-Headers", "Content-Type, api_key, Authorization"); 
     }); 

     logger.info("CORS support enabled."); 
    } 
} 

あなたは(必要に応じて、あなたのテストクラスで)あなたの主な方法で、このコンテキストクラスを使用することができるはずです。

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

    RestContext context = new RestContext(8080, "/api"); 

    context.addEndpoint(new CustomerEndpoint(new CustomerService())); 
    context.addEndpoint(new AnotherEndpoint()); // you can add or remove as many as you want. 

    context.enableCors(); 
} 

OBS:Since version 2.5、スパークJavaはサービスを通じて複数のインスタンスをサポートしています.ignite() api。

関連する問題