如何启用 MultiPartFeature?
How can I enable MultiPartFeature?
我的 JAX-RS 应用程序有一个扩展应用程序 class。
@ApplicationPath("/")
public class MyApplication extends Application {
// empty; really empty
}
如何在不修改 class 的情况下启用 org.glassfish.jersey.media.multipart.MultiPartFeature
?或者无需注册所有资源 classes/packages?
不确定为什么不直接使用 ResourceConfig
而不是 Application
class。我能想到的唯一原因是可移植性,但使用 Jersey 特定的多部分功能已经破坏了可移植性。
但无论如何,我会尝试以 "most portable" 的方式回答这个问题。你可以做的是设置一个 属性,就像你在 web.xml 中所做的那样。要设置任意属性,您可以覆盖
@Override
public Map<String, Object> getProperties() {}
在 Application
子 class 中,并在那里设置属性。
@Override
public Map<String, Object> getProperties() {
Map<String, Object> props = new HashMap<>();
props.put("jersey.config.server.provider.classnames",
"org.glassfish.jersey.media.multipart.MultiPartFeature");
return props;
}
这将为您的资源和供应商维护class路径扫描。仅当您覆盖 getClasses()
或 getSingletons()
(和 return 非空集)时才会禁用扫描,但 getProperties()
没问题。
另一个选项:
创建一个Feature
来包装那个特征,并让这个特征被发现,如
就个人而言,我会...
只需使用 ResourceConfig
,因为您已经破坏了可移植性(还有一点破坏 :-)
@ApplicationPath("/")
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("packages.to.scan");
register(MultiPartFeature.class);
}
}
我的工作如下:
final ResourceConfig resourceConfig = new ResourceConfig(ApplicationConfig.class);
resourceConfig.packages("com.econorma.rest");
resourceConfig.register(MultiPartFeature.class);
ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(resourceConfig));
这是ApplicationConfig class
@ApplicationPath("/")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> resources = new HashSet<Class<?>>();
resources.add(MultiPartFeature.class);
resources.add(EntryPoint.class);
return resources;
}
@Override
public Map<String, Object> getProperties() {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("jersey.config.server.provider.packages", "com.econorma.rest");
return properties;
}
}
我的 JAX-RS 应用程序有一个扩展应用程序 class。
@ApplicationPath("/")
public class MyApplication extends Application {
// empty; really empty
}
如何在不修改 class 的情况下启用 org.glassfish.jersey.media.multipart.MultiPartFeature
?或者无需注册所有资源 classes/packages?
不确定为什么不直接使用 ResourceConfig
而不是 Application
class。我能想到的唯一原因是可移植性,但使用 Jersey 特定的多部分功能已经破坏了可移植性。
但无论如何,我会尝试以 "most portable" 的方式回答这个问题。你可以做的是设置一个 属性,就像你在 web.xml 中所做的那样。要设置任意属性,您可以覆盖
@Override
public Map<String, Object> getProperties() {}
在 Application
子 class 中,并在那里设置属性。
@Override
public Map<String, Object> getProperties() {
Map<String, Object> props = new HashMap<>();
props.put("jersey.config.server.provider.classnames",
"org.glassfish.jersey.media.multipart.MultiPartFeature");
return props;
}
这将为您的资源和供应商维护class路径扫描。仅当您覆盖 getClasses()
或 getSingletons()
(和 return 非空集)时才会禁用扫描,但 getProperties()
没问题。
另一个选项:
创建一个Feature
来包装那个特征,并让这个特征被发现,如
就个人而言,我会...
只需使用 ResourceConfig
,因为您已经破坏了可移植性(还有一点破坏 :-)
@ApplicationPath("/")
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("packages.to.scan");
register(MultiPartFeature.class);
}
}
我的工作如下:
final ResourceConfig resourceConfig = new ResourceConfig(ApplicationConfig.class);
resourceConfig.packages("com.econorma.rest");
resourceConfig.register(MultiPartFeature.class);
ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(resourceConfig));
这是ApplicationConfig class
@ApplicationPath("/")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> resources = new HashSet<Class<?>>();
resources.add(MultiPartFeature.class);
resources.add(EntryPoint.class);
return resources;
}
@Override
public Map<String, Object> getProperties() {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("jersey.config.server.provider.packages", "com.econorma.rest");
return properties;
}
}