0
Jersey (1.12)를 사용하여 REST 서비스를 통해 POJO를 노출하고자하는 부두 서버 (8.1.3)가 있습니다. 리소스를 JSON에 매핑하는 데 문제가 있으며 그 이유를 파악할 수 없습니다.Jetty에서 Jersey를 사용하여 JSON에 매핑
부두와 뉴저지 서블릿 시작 :
public class JettyUtil {
public static void start() throws Exception {
Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(8999);
server.addConnector(connector);
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { createJerseyServlet(), new DefaultHandler() });
server.setHandler(handlers);
server.start();
server.join();
}
private static Handler createJerseyServlet() {
ServletContextHandler handler = new ServletContextHandler();
handler.setContextPath("/game");
SessionHandler sessionHandler = new SessionHandler();
handler.setSessionHandler(sessionHandler);
ServletHolder holder = handler.addServlet("com.sun.jersey.spi.container.servlet.ServletContainer", "/*");
Map<String,String> initParams = ImmutableMap.of(
"com.sun.jersey.config.property.packages", "com.test.todo.rest",
"com.sun.jersey.api.json.POJOMappingFeature", "true");
holder.setInitParameters(initParams);
return handler;
}
}
리소스 :
@XmlRootElement
public class Todo {
private String summary;
public String getSummary() { return summary; }
public void setSummary(String summary) { this.summary = summary; }
}
Webservice를 :
@Path("/todo")
public class TodoResource {
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Todo getTodo() {
Todo todo = new Todo();
todo.setSummary("This is my first todo");
return todo;
}
}
테스트 :
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(getBaseURI());
System.out.println(
service.path("game").path("todo").
accept(MediaType.APPLICATION_JSON).get(String.class));
출력 부두 서버 :
May 24, 2012 4:21:34 PM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: A message body writer for Java class com.test.todo.rest.Todo, and Java type class com.test.todo.rest.Todo, and **MIME media type application/json was not found**
May 24, 2012 4:21:34 PM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: The registered message body writers compatible with the MIME media type are:
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter
com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
May 24, 2012 4:21:34 PM com.sun.jersey.spi.container.ContainerResponse logException
SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException:
com.sun.jersey.api.MessageException: A message body writer for Java class com.test.todo.rest.Todo, and Java type class com.test.todo.rest.Todo, and MIME media type application/json was not found
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.jvva:1451)
...
질문 :
가 어떻게 부두에서 저지 서블릿을 사용하여 지원되는 MIME 형식으로 '응용 프로그램/JSON'를 추가해야 ? com.sun.jersey.api.json.POJOMappingFeature를 true로 설정하는 것이 트릭이라고 생각했습니다. (XML을 올바르게 가져 오면 작동하지만 Json과도 함께 작동해야합니다.)
고마워요! POM에 'jersey-json'을 추가하면 트릭을 만들었습니다! – perseger