Search code examples
routesspark-java

sparkjava: Do routes have to be in main method?


I am new to sparkjava and like it overall. However, do new routes/endpoints have to be defined in the main method? For any significant web application, this will result in a very long main method or I need to have multiple main methods (and therefore split server resources among multiple instances).

These two sparkjava documentation pages seem to define routes in the main method: http://sparkjava.com/documentation.html#routes and here http://sparkjava.com/documentation.html#getting-started.

Is there another way to do this that I'm not seeing? Cursory google searching hasn't shown me a better way ...

=========

Here is the full solution I did based on the answer from Andrew. In my opinion, adding endpoints outside of the main method should be part of the sparkjava documentation page:

Main Method:

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());
}

My resource:

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());
    }
}

My service:

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;
    }
}

Solution

  • You can set routes where you want. You just need call set up method in main thread. e.g.

     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());
        }
     }