1

我正在尝试使用预配置的资源实例在预配置的端口/url 上启动 Jersey。我不太清楚如何正确地做到这一点。

这是一段代码。请帮帮我,填空:

@Component
@PerRequest
@Path("/svc")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public class MyService
{
    // This piece is known
}

public class JSONMessageBodyWriter implements MessageBodyWriter<Object>
{
    // This piece is known
}

public class XMLMessageBodyWriter implements MessageBodyWriter<Object>
{
    // This piece is known
}

// This is where I need help
MyService service = new MyService();
...
HttpHandler handler = ???
...
HttpServer server = ???
server.createContext("/services", handler);
...
server.start();

在上面的代码片段中,我试图通过http://localhost:8080/services/svc url 公开 MyService。如果将插入 JSONMessageBodyWriter 和 XMLMessageBodyWriter - 该服务将相应地针对 XML 和 JSON 工作。

如果你知道如何在 Jetty 或 Grizzly 上执行此操作,也请告诉我。春天能帮上忙吗?

4

1 回答 1

2

Jersey 本身提供了一整套示例,特别是最简单的 helloworld 示例显示了如何在端口上启动服务器以仅运行它或在 JUnits 中进行测试。如果您看一下,您将获得有关如何设置和启动服务器的示例。

现在,在将 MessageBodyReaders 和 MessageBodyWriters 配置为 jersey 应用程序的一部分时,您会发现 JAX-RS 规范本身(由 jersey 实现)涵盖了这一点。首先,您的读者和作者需要 @Provider 注释。此外,读者应该得到@Consumes 注释,而作者应该得到@Produces 注释,因此您可以分别指定它们消费和产生的mime-type。

接下来是激活它们。上面的 helloworld 示例不会显示这一点,因为它不使用自定义读取器或写入器(另一个示例可能,我没有看)。因此,无需提供包来查找资源(就像它们所做的那样;当您看到 helloworld 示例时,您就会知道我所说的内容),您将编写 Application 的子类,在其中指定资源类和读取器/写入器类。对于 reader 和 writer,您可以选择指定一个类(从 getClasses 返回),或者自己提供一个已经创建的实例(从 getSingletons 返回)。

最后,将 Application 子类的名称指定为 init-parameter 的值"javax.ws.rs.Application"。当您启动服务器时,可以将 init-params 传递给 GrizzlyWebContainerFactory.create(同样,您将在示例中看到它使用的)。

希望这可以帮助。

于 2009-06-12T02:13:36.590 回答