在 Jersey 中使用配置属性
Working with configuration properties in Jersey
我使用 java/jetty 自托管服务器和 jersey-2 java RESTful api。
应用程序有 application.properties 个具有属性的文件。
ConfigurationProperties
class 读取属性文件并将其加载到 java.util.Properties
class.
Jetty 服务器实例化是通过以下方式完成的。
// Create and register resources
final ResourceConfig resourceConfig = new ApiServiceConfig()
.register(new DependencyInjectionBinder());
ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
contextHandler.setContextPath("/mydomain/api");
Server jettyServer = new Server(8585);
jettyServer.setHandler(contextHandler);
ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(resourceConfig));
contextHandler.addServlet(jerseyServlet, "/*");
// Create web context. Can't use.
//WebApplicationContext webContext = getWebApplicationContext();
// Add web context to servlet event listener.
//contextHandler.addEventListener(new ContextLoaderListener(webContext));
try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
jettyServer.destroy();
}
我不能使用 Spring AnnotationConfigWebApplicationContext
因为它需要 commons-logging 依赖,这在 java-8 中不起作用。
如何在 jetty/jersey 上下文中注册属性以及稍后如何检索值(例如:context.getProperty("prop.name")
)?
你可以...
只需将 Properties
对象配置为可注入对象,然后将其注入到您需要的任何地方
final Properties props ...
resourceConfig.register(new AbstractBinder() {
@Override
protected void configure() {
bind(props).to(Properties.class);
}
});
@Path("config")
public class ConfigResource {
@Inject
private Properties properties;
}
你可以...
使用 InjectionResolver
和自定义注释
使各个属性可注入
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public static @interface Config {
String value();
}
public class ConfigInjectionResolver implements InjectionResolver<Config> {
private final Properties properties;
public ConfigurationInjectionResolver(Properties properties) {
this.properties = properties;
}
@Override
public Object resolve(Injectee injectee, ServiceHandle<?> handle) {
if (String.class == injectee.getRequiredType()) {
Config annotation = injectee.getParent().getAnnotation(Config.class);
if (annotation != null) {
String prop = annotation.value();
return properties.getProperty(prop);
}
}
return null;
}
...
}
final Properties props...
resourceConfig.register(new AbstractBinder(){
@Override
protected void configure() {
bind(new ConfigInjectResolver(props))
.to(new TypeLiteral<InjectionResolver<Config>>(){});
}
});
然后将其与自定义注释一起使用
@Path("config")
public class ConfigResource {
@Config(PROP_KEY)
private String propValue;
@GET
public String getConfigProp() {
return propValue;
}
}
你可以...
使用我制作的small library
<dependency>
<groupId>com.github.psamsotha</groupId>
<artifactId>jersey-properties</artifactId>
<version>0.1.1</version>
<dependency>
resourceConfig.register(JerseyPropertiesFeature.class);
resourceConfig.property(JerseyPropertiesFeature.RESOURCE_PATH, "appication.properties");
@Path("test")
public class SomeResource {
@Prop("some.prop")
private String someFieldProp;
private String someConstructorProp;
public SomeResource(@Prop("some.prop") String someConstructorProp) {
this.someConstructorProp = someConstructorProp;
}
@GET
public String get(@Prop("some.prop") String someParamProp) {
return someParamProp;
}
}
你可以...
使用Spring。我认为您在使用 Java 8 时面临的问题是您正在使用 Spring 3.x。我认为 Java 8 不受支持。我在使用 Jersey/Spring4 和 java 8 时没有遇到任何问题。如果您使用的是 jersey-spring3 依赖项,则需要排除 spring3 依赖项,并添加spring 4. 参见
另请参阅:
我使用 java/jetty 自托管服务器和 jersey-2 java RESTful api。 应用程序有 application.properties 个具有属性的文件。
ConfigurationProperties
class 读取属性文件并将其加载到 java.util.Properties
class.
Jetty 服务器实例化是通过以下方式完成的。
// Create and register resources
final ResourceConfig resourceConfig = new ApiServiceConfig()
.register(new DependencyInjectionBinder());
ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
contextHandler.setContextPath("/mydomain/api");
Server jettyServer = new Server(8585);
jettyServer.setHandler(contextHandler);
ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(resourceConfig));
contextHandler.addServlet(jerseyServlet, "/*");
// Create web context. Can't use.
//WebApplicationContext webContext = getWebApplicationContext();
// Add web context to servlet event listener.
//contextHandler.addEventListener(new ContextLoaderListener(webContext));
try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
jettyServer.destroy();
}
我不能使用 Spring AnnotationConfigWebApplicationContext
因为它需要 commons-logging 依赖,这在 java-8 中不起作用。
如何在 jetty/jersey 上下文中注册属性以及稍后如何检索值(例如:context.getProperty("prop.name")
)?
你可以...
只需将 Properties
对象配置为可注入对象,然后将其注入到您需要的任何地方
final Properties props ...
resourceConfig.register(new AbstractBinder() {
@Override
protected void configure() {
bind(props).to(Properties.class);
}
});
@Path("config")
public class ConfigResource {
@Inject
private Properties properties;
}
你可以...
使用 InjectionResolver
和自定义注释
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public static @interface Config {
String value();
}
public class ConfigInjectionResolver implements InjectionResolver<Config> {
private final Properties properties;
public ConfigurationInjectionResolver(Properties properties) {
this.properties = properties;
}
@Override
public Object resolve(Injectee injectee, ServiceHandle<?> handle) {
if (String.class == injectee.getRequiredType()) {
Config annotation = injectee.getParent().getAnnotation(Config.class);
if (annotation != null) {
String prop = annotation.value();
return properties.getProperty(prop);
}
}
return null;
}
...
}
final Properties props...
resourceConfig.register(new AbstractBinder(){
@Override
protected void configure() {
bind(new ConfigInjectResolver(props))
.to(new TypeLiteral<InjectionResolver<Config>>(){});
}
});
然后将其与自定义注释一起使用
@Path("config")
public class ConfigResource {
@Config(PROP_KEY)
private String propValue;
@GET
public String getConfigProp() {
return propValue;
}
}
你可以...
使用我制作的small library
<dependency>
<groupId>com.github.psamsotha</groupId>
<artifactId>jersey-properties</artifactId>
<version>0.1.1</version>
<dependency>
resourceConfig.register(JerseyPropertiesFeature.class);
resourceConfig.property(JerseyPropertiesFeature.RESOURCE_PATH, "appication.properties");
@Path("test")
public class SomeResource {
@Prop("some.prop")
private String someFieldProp;
private String someConstructorProp;
public SomeResource(@Prop("some.prop") String someConstructorProp) {
this.someConstructorProp = someConstructorProp;
}
@GET
public String get(@Prop("some.prop") String someParamProp) {
return someParamProp;
}
}
你可以...
使用Spring。我认为您在使用 Java 8 时面临的问题是您正在使用 Spring 3.x。我认为 Java 8 不受支持。我在使用 Jersey/Spring4 和 java 8 时没有遇到任何问题。如果您使用的是 jersey-spring3 依赖项,则需要排除 spring3 依赖项,并添加spring 4. 参见
另请参阅: