我的JAX-RS应用程序有一个扩展的Application类。
@ApplicationPath("/")
public class MyApplication extends Application {
// empty; really empty
}
如何在不修改课程的情况下启用org.glassfish.jersey.media.multipart.MultiPartFeature
?或者没有必要注册所有资源类/包?
答案 0 :(得分:12)
不确定为什么你不只是使用ResourceConfig
而不是Application
类。我能想到的唯一原因是可移植性,但使用Jersey特定的多部分功能已经打破了这种可移植性。
但无论如何,我会尝试以“最便携”的方式回答这个问题。您可以做的是设置属性,就像在web.xml中一样。要设置任意属性,可以覆盖
@Override
public Map<String, Object> getProperties() {}
在Application
子类中,并在那里设置属性。
@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;
}
这将维护资源和提供程序的类路径扫描。只有在您覆盖getClasses()
或getSingletons()
(并返回非空集)时才会禁用扫描,但getProperties()
没问题。
另一种选择:
创建Feature
以包装 功能,然后发现该功能,seen here
就个人而言,我会......
只需使用ResourceConfig
,因为您已经破坏了可移植性(更多的是破损: - )
@ApplicationPath("/")
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("packages.to.scan");
register(MultiPartFeature.class);
}
}
答案 1 :(得分:-1)
对我来说,工作如下:
final ResourceConfig resourceConfig = new ResourceConfig(ApplicationConfig.class);
resourceConfig.packages("com.econorma.rest");
resourceConfig.register(MultiPartFeature.class);
ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(resourceConfig));
这是ApplicationConfig类
@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;
}
}