I am studying the jersey framework. I am confused about this article, section is json -> jackson. https://jersey.java.net/documentation/latest/media.html
I dont know why he extends ObjectMapper and register this MyObjectMapper, why not register provider directly? what is relationship between ObjectMapper and provider?
I tried my mind that register a jackson provider directly, but when i run start application, i get "stack overflow error", because i get unlimited loop.
public class App {
private static URI BASE_URI = URI.create("http://localhost:8080/");
public static void main( String[] args ) {
System.out.println( "Hello World!" );
try {
final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, new MyBlogApplication(), false);
server.start();
} catch (IOException ie) {
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ie);
}
}}
class MyBlogApplication extends ResourceConfig {
public MyBlogApplication() {
packages("org.xiongbingchao.resources;org.xiongbingchao.service");
register(JacksonJsonProvider.class);
}
}
My restful resource:
@Path("/articles")
public class ArticlesResource {
@GET
@Produces("application/json")
public Vector<Article> getArticleList() {
return new Vector<Article>();
}
@GET
@Path("/{articleId}")
@Produces("application/json")
public Article getArticle(@PathParam("articleId") int articleId) {
return new Article();
}
}
when i access localhost:8080/articles/3
error stack: note: top content are many repeat, so i hide them
at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:92)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130)
at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:711)
at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444)
at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434)
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:384)
at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:224)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: org.xiongbingchao.dao.Article
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690)
Caused by: java.lang.StackOverflowError
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:709)
... 1011 more
In brower, i got many many many repeat record:
{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":{"article_id":0,"user_id":0,"content":"","created_at":"","updated_at":"","articleById":
2016/08/01
Add my code:
public class Article {
public int article_id;
public int user_id;
public String content;
public String created_at;
public String updated_at;
public Article () {
this.article_id = 0;
this.user_id = 0;
this.content = "";
this.created_at = "";
this.updated_at = "";
}
public Article getArticleById() {
return new Article();
}
public Vector<Article> getArticleList(Vector<Integer> articleIds) {
return new Vector<Article>();
}
}