我想知道什么是为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类的方法中的一种常用方法,还是像我目前所做的那样?还是有一种更常见的方式来维护这种东西?
答案 0 :(得分:2)
这有两个方面,
它实际上具有接近于零的性能问题。这必须具有可读性。
static
常量将其保存在其他文件中。
我个人更喜欢第二种,即将所有路径保存在名为 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.bar
是property souce中定义的值(例如application.properties
文件或YAML变体)。
URI路径模式还可以嵌入
${…}
个占位符,这些占位符在启动时通过针对本地,系统,环境和其他属性源使用PropertyPlaceHolderConfigurer
来解析。例如,您可以使用它来基于一些外部配置参数化基本URL。