我有嵌入式jetty服务器我想创建RESTful GET服务,它返回XML / JSON格式的pojo作为响应。谁能给我一个基本的例子如何为jetty编写处理程序?给出的示例仅显示文本类型输出。
答案 0 :(得分:1)
我建议你使用Jersey java REST框架(http://jersey.java.net/)。该框架易于学习。你可以像JAXB一样使用Object to Xml转换器来让你的生活更轻松。
答案 1 :(得分:1)
嗯。我有同样的问题。 我通过使用实用程序jar文件来解决它,该文件读取属性文件以配置Jersey Servlet,处理程序,静态文件,爆炸webapps等的上下文,使得生成的应用程序jar自动配置上下文并从命令行运行。
基本上我有一个HandlerCollection并连续添加servlet。
ServletHolder servletHolder = new ServletHolder(ServletContainer.class);
servletHolder.setInitParameter(
"com.sun.jersey.config.property.packages",
clazz.getPackage().getName()
);
ServletContextHandler context = new ServletContextHandler(
server,
"/some_path",
ServletContextHandler.SESSIONS
);
context.setClassLoader(Thread.currentThread().getContextClassLoader());
context.addServlet(servletHolder, "/");
context.setHandler(handler);
handlers.addHandler(context);
然后我有一个示例Jersey servlet:
@Path("/user1")
public class JerseyResource1 {
public JerseyResource1() {
}
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public ExamplePojo getUser() {
log.debug("Inside ExampleJerseyResource1 getUser()");
ExamplePojo pojo = new ExamplePojo();
pojo.setNumber(100);
pojo.setWords("hello world 1");
return pojo;
}
}
当泽西配置东西时,第一次调用会获得性能上升,但它只能起作用。
junit测试看起来像这样:
@BeforeClass
public static void setUpClass() throws Exception {
Thread startupThread = new Thread() {
@Override
public void run() {
try {
System.out.println("Starting Jetty...");
JettyMain.main(new String[] {});
// CHECKSTYLE_OFF: Because it does throw Exception!
} catch (Exception ex) {
// CHECKSTYLE_ON
System.err.println("Error Starting Jetty: " + ex);
}
}
};
startupThread.start();
System.out.println("Waiting a few seconds to ensure Jetty is started");
Thread.sleep(2000);
System.out.println("Ok. Starting tests");
}
@AfterClass
public static void tearDownClass() throws Exception {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(
UriBuilder.fromUri(
"http://localhost:8080/admin/stop?secret=YourSecret"
).build());
service.get(String.class);
System.out.println("Sent stop command");
}
@Test
public void testJersey1() {
System.out.println("Jersey1 returns correct 200 and body");
ClientResponse response = getService(
"http://localhost:8080/jersey1/user1/"
).get(ClientResponse.class);
assertEquals("Response is 200", 200, response.getStatus());
assertEquals(
"Valid body",
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
+ "<examplePojo><number>100</number><words>hello world 1</words></examplePojo>",
response.getEntity(String.class)
);
System.out.println("--> WORKED!");
}
CURL调用如下所示:
# Show static public files folder:
curl -v http://localhost:8080/public/x.html
curl -v http://localhost:8080/public/x.txt
# Use baseline handlers:
curl -v http://localhost:8080/handler1/?url=hello
curl -v http://localhost:8080/handler2/?url=hello
# Use raw servlets with specific contexts:
curl -v http://localhost:8080/servlet1?url=hello
curl -v http://localhost:8080/servlet2?url=hello
# Call a Jersey servlet using default Accept header (xml):
curl -v http://localhost:8080/jersey1/user1/
curl -v http://localhost:8080/jersey2/user2/
# Request Jersey servlet but want JSON:
curl -v --header "Accept:application/json" http://localhost:8080/jersey1/user1/
# Use an exploded webapp:
curl -v http://localhost:8080/www/x.html
# Stop the server:
curl -v http://localhost:8080/admin/stop?secret=MySecret
呃......以下不是插件。认真。它可能会被公司拒绝......
我有一个完整的解决方案,通过该解决方案添加1个jar文件作为依赖项和几个小文件(app.properties,classpath.sh,log4j.properties和run.sh),为大量上下文完全配置Jetty8实例,处理程序,Servlets,JerseyServlets,StaticFiles和ExplodedWebApps。结果是一个自包含的可执行Jar,它几乎不费力地重新启动,重新加载,停止等。另一个好处是它可以充当伪类加载器并避免jar-hell。 (副作用是mvn clean test也适用于它)
如果有人感兴趣,请打电话给我,我可以看看该公司是否允许我使用OpenSource并在GitHub上获取它。 或者甚至可以通过我自己的网站http://www.randomactsofsentience.com
进行记录答案 2 :(得分:1)
仅仅是关于嵌入式Jetty的FYI ...我已经创建了一个github项目,我谦虚地提交可以涵盖大多数不断出现的嵌入式码头问题。有关详细信息,请参阅https://github.com/ZenGirl/EmbeddedJettyRepository。
答案 3 :(得分:0)
使用框架来处理JSON的序列化是必须的方法。但是,这是一个简单的示例:
public class MyServer extends AbstractHandler
{
private static final int PORT = 8080;
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().print("{ \"my_data\": \"Hello from Java!\" }");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
}
public static void main(String[] args) throws Exception {
Server server = new Server(PORT);
server.setHandler(new MeServer());
server.start();
System.out.println("Jetty started: http://localhost:" + PORT + "/");
server.join();
}
}