如何使用特定的MessageBodyReader / Writers特定资源实例初始化Jersey?

时间:2009-05-26 00:50:35

标签: java spring jetty jersey grizzly

我正在尝试使用预配置的资源实例在预配置的端口/ 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网址公开MyService。如果将插入JSONMessageBodyWriter和XMLMessageBodyWriter - 该服务将相应地对XML和JSON工作。

如果您知道如何在Jetty或Grizzly上执行此操作,请告诉我。春天可以帮助吗?

1 个答案:

答案 0 :(得分:2)

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

现在,在将MessageBodyReaders和MessageBodyWriters配置为泽西应用程序的一部分时,您会发现这是由JAX-RS规范本身(泽西实现的)所涵盖的。首先,您的读者和作者需要@Provider注释。此外,读者应该获得@Consumes注释,并且编写者应该获得@Produces注释,因此您可以分别指定他们使用和生成的mime类型。

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

最后,将Application子类的名称指定为init-parameter "javax.ws.rs.Application"的值。启动服务器时,init-params可以传递给GrizzlyWebContainerFactory.create(再次,你会在示例中看到这个)。

希望这有帮助。