Bri*_*ace 12 java jax-rs jersey grizzly cdi
如何允许CDI将资源注入到宁静的Web服务资源中?我使用焊接2(cdi),泽西(jaxrs)和灰熊(网络服务器)在标准java上运行.这是我简单的网络资源:
import training.student.StudentRepository;
import javax.inject.Inject;
import javax.ws.rs.*;
@Path("student")
public class StudentWebResource {
@Inject
private StudentRepository studentRepository;
@GET
@Path("count")
@Produces(MediaType.TEXT_PLAIN)
public Integer getCount() {
return studentRepository.studentCount();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我如何焊接启动我的简单Web服务器:
public class Main {
public static void main(String[] args) throws Exception {
startCdiApplication();
}
public static void startCdiApplication() throws Exception {
Weld weld = new Weld();
try {
WeldContainer container = weld.initialize();
Application application = container.instance().select(WebServer.class).get();
application.run();
}
finally {
weld.shutdown();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怀疑的代码需要修改,以通知球衣使用焊接CDI注入分辨率:
...
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;
public class WebServer implements Application {
/*
* startup the grizzly http server to make available the restful web services
*/
private void startWebServer() throws IOException, InterruptedException {
final ResourceConfig resourceConfig = new ResourceConfig().packages("training.webservice").register(new JacksonFeature());
final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(getBaseUri(), resourceConfig);
server.start();
Thread.currentThread().join();
}
...
@Override
public void run() throws IOException, InterruptedException {
startWebServer();
}
}
Run Code Online (Sandbox Code Playgroud)
Bri*_*ace 13
看到这个stackoverflow帖子后,我实现了以下解决方案.不确定它是否是最好的路线,但它确实有效.
我创建了一个hk2 Binder并注册了Binder:
public class WebServiceBinder extends AbstractBinder {
@Override
protected void configure() {
BeanManager bm = getBeanManager();
bind(getBean(bm, StudentRepository.class))
.to(StudentRepository.class);
}
private BeanManager getBeanManager() {
// is there a better way to get the bean manager?
return new Weld().getBeanManager();
}
private <T> T getBean(BeanManager bm, Class<T> clazz) {
Bean<T> bean = (Bean<T>) bm.getBeans(clazz).iterator().next();
CreationalContext<T> ctx = bm.createCreationalContext(bean);
return (T) bm.getReference(bean, clazz, ctx);
}
}
Run Code Online (Sandbox Code Playgroud)
然后将ResourceConfig实例化从上面修改为:
final ResourceConfig resourceConfig = new ResourceConfig()
.packages("training.webservice")
.register(new JacksonFeature())
.register(new WebServiceBinder());
Run Code Online (Sandbox Code Playgroud)
选定的答案可以追溯到前一段时间.在自定义HK2活页夹中声明每个绑定是不切实际的.我只需要添加一个依赖项.尽管它是专为Glassfish设计的,但它完全适合其他容器.我正在使用Tomcat/Grizzly.
<dependency>
<groupId>org.glassfish.jersey.containers.glassfish</groupId>
<artifactId>jersey-gf-cdi</artifactId>
<version>2.14</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
以下是JerseyTest的示例(如果您从main方法运行它,则相同的原则).我只需声明对weld-se的依赖并在实例化我的资源之前声明一个Weld容器 - 正如你所做的那样 - 并且它开箱即用.
public class GrizzlyTest extends JerseyTest {
private Weld weld;
private WeldContainer container;
@Override
protected Application configure() {
weld = new Weld();
container = weld.initialize();
return new ResourceConfig(MyResource.class);
}
@Test
public void test() {
System.out.println(target("myresource").request().get(String.class));
}
@After
public void after() {
weld.shutdown();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18513 次 |
最近记录: |