Routes sparkjava:路由必须在main方法中吗?

Routes sparkjava:路由必须在main方法中吗?,routes,spark-java,Routes,Spark Java,我不熟悉sparkjava,总体上喜欢它。但是,是否必须在main方法中定义新的路由/端点?对于任何重要的web应用程序,这将导致一个非常长的main方法,或者我需要有多个main方法(因此在多个实例之间拆分服务器资源) 这两个sparkjava文档页面似乎在main方法中定义了路由:和这里 有没有其他我没见过的方法?粗略的谷歌搜索并没有给我提供更好的方法 ========= 以下是我根据Andrew的回答所做的完整解决方案。在我看来,在main方法之外添加端点应该是sparkjava文档页面的

我不熟悉sparkjava,总体上喜欢它。但是,是否必须在main方法中定义新的路由/端点?对于任何重要的web应用程序,这将导致一个非常长的main方法,或者我需要有多个main方法(因此在多个实例之间拆分服务器资源)

这两个sparkjava文档页面似乎在main方法中定义了路由:和这里

有没有其他我没见过的方法?粗略的谷歌搜索并没有给我提供更好的方法

=========

以下是我根据Andrew的回答所做的完整解决方案。在我看来,在main方法之外添加端点应该是sparkjava文档页面的一部分:

主要方法:

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());
    }
}
我的服务:

public class Service {

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

    public Object findAll() {
        return null;
    }
}
我的JsonTransformer:

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

您可以根据需要设置路线。您只需要在主线程中调用setup方法。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());
    }
 }

您还可以将Spring集成到Spark应用程序中。这就是我配置路由的方式

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

这使我能够避免SparkApp主方法中的设置调用步骤。

当有多个端点要配置时,可以使用以下设计思想:

首先,创建一个生成器界面:

public interface EndpointBuilder {
    void configure(Service spark, String basePath);
}
现在,假设您有许多其他rest端点资源之一需要设置:

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类,该类将保存spark实例,并允许您配置所需的任何路由:

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.");
    }
}
您应该能够在主方法(以及可选的测试类)中使用该上下文类:


注意:spark java通过Service.ignite()api支持多个实例。

我想spark java是为那些不需要大量额外配置的人设计的

所以,我只是把和additional方法放在控制器中,名为declareRoutes,我把声明放在这里

对于示例应用程序:

public class LoginController {

    public static void declareRoutes(){
        get(Path.Web.LOGIN, LoginController.serveLoginPage);
        post(Path.Web.LOGIN, LoginController.handleLoginPost);
        post(Path.Web.LOGOUT, LoginController.handleLogoutPost);
    }

    public static Route serveLoginPage = (Request request, Response response) -> {
        Map<String, Object> model = new HashMap<>();
        model.put("loggedOut", removeSessionAttrLoggedOut(request));
        model.put("loginRedirect", removeSessionAttrLoginRedirect(request));
        return ViewUtil.render(request, model, Path.Template.LOGIN);
    };
DeclareChallRoute()只是:

适合我的需要,不需要任何新的抽象


HTH

谢谢你的主意。
public class LoginController {

    public static void declareRoutes(){
        get(Path.Web.LOGIN, LoginController.serveLoginPage);
        post(Path.Web.LOGIN, LoginController.handleLoginPost);
        post(Path.Web.LOGOUT, LoginController.handleLogoutPost);
    }

    public static Route serveLoginPage = (Request request, Response response) -> {
        Map<String, Object> model = new HashMap<>();
        model.put("loggedOut", removeSessionAttrLoggedOut(request));
        model.put("loginRedirect", removeSessionAttrLoginRedirect(request));
        return ViewUtil.render(request, model, Path.Template.LOGIN);
    };
 // Routes

 Class[] controllers = {
          IndexController.class,
          LoginController.class,
          SandboxController.class,
          ServicesController.class };

 for (Class controller: controllers) {
         Method m = controller.getMethod("declareRoutes");
         m.invoke(m);
 }

 // Catch all
 declareCatchAllRoute();
private void declareCatchAllRoute() {
    get("*", ViewUtil.notFound);
}