维护RestControllers的路径常量

时间:2019-03-21 14:15:33

标签: java rest

我想知道什么是为Rest Controller维护路径常数的常用样式。 例如,您有类似的内容:

@RequestMapping(method = RequestMethod.GET, value = ANY_PATH_VALUE)

此刻,我确实在名为PathConstants的类中维护这些常量(在示例ANY_PATH_VALUE中),如下所示:

public abstract class PathConstants {
    public static final String ANY_PATH_VALUE = "/path/{SOME_ID}";
    ...
}

是将这些值直接保留在RestController类的方法中的一种常用方法,还是像我目前所做的那样?还是有一种更常见的方式来维护这种东西?

3 个答案:

答案 0 :(得分:2)

这有两个方面,

它实际上具有接近于零的性能问题。这必须具有可读性

  • 第一个视图是将值作为本地字符串本身保留在控制器中。
    从进入控制器时可以直接检查确切的API路由的角度来看,这更具可读性。
  • 第二种观点是使用static常量将其保存在其他文件中。
    保持所有这样的路由实际上会给您一个共同的地方,让您可以了解当前在应用程序中支持的所有API路由。


我个人更喜欢第二种,即将所有路径保存在名为 APIRoutes 的文件中,并进一步按域划分。

public class APIRoutes {

    public class SYSTEM {
         public static final String HEALTH_CHECK = "api/v1/healthcheck";
         public static final String LB_HEALTH_CHECK = "lb/v1/healthcheck";
    }

    public class API {
         public static final String SAVE_X = "api/v1/save";
         public static final String GET_X = "api/v1/get";
    }

    public class CACHE {
         public static final String RELOAD_X = "cache/v1/load/x";
         public static final String RELOAD_Y = "cache/v1/load/y";
    }

}

这样,在您的控制器中,您会遇到类似

的问题
@RequestMapping(method = RequestMethod.GET, value = APIRoutes.API.SAVE_X)

答案 1 :(得分:0)

我认为这是维护路径的合理方法。只要确保您总是从其他常量构建路径即可。例如,如果您的路径具有版本,则可以将版本定义为另一个变量。

public static final String VERSION_1 = "/v1";
public static final String USERS_V1 = VERSION_1 + "/users";

答案 2 :(得分:0)

使用常量似乎是一种合理的方法。但是,我将使用final构造函数在private类中定义常量,并抛出一个AssertionError来强制 noninstantiability

public final class PathConstants  {

    // Suppress default constructor for noninstantiability
    private PathConstants() {
        throw new AssertionError("No instances for you!");
    }

    public static final String PATH_TO_FOO = "foo";
    public static final String PATH_TO_BAR = "bar";
}

引用Joshua Bloch的有效Java 3 rd 版本中的项目4:

  

由于显式构造函数为private,因此在类外部无法访问。 AssertionError不是严格要求的,但是它提供了保险,以防万一从类内部意外调用构造函数。它确保在任何情况下都不会实例化该类。这个惯用法有点违反直觉,因为构造函数是明确提供的,因此无法调用它。因此,如前所述,添加评论是明智的。

     

作为副作用,此惯用法还防止类被子类化。所有构造函数都必须显式或隐式调用超类构造函数,并且子类将没有可调用的可访问超类构造函数。


您还可以使用类似@RequestMapping("${foo.bar}")的名称,其中foo.barproperty souce中定义的值(例如application.properties文件或YAML变体)。

引用Spring MVC documentation

  

URI路径模式还可以嵌入${…​}个占位符,这些占位符在启动时通过针对本地,系统,环境和其他属性源使用PropertyPlaceHolderConfigurer来解析。例如,您可以使用它来基于一些外部配置参数化基本URL。