0

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>();
}
}
林林夕
  • 1
  • 1
  • I bet the problem is because you have circular dependencies in your `Article` model. This will definitely cause a Stack overflow if not configured correctly. You may want to search for articles about how to handle bi-directional relationships in Jackson. Or it looks like you have a method `getArticleById`. By default Jackson will call all `getXxx` methods when serializing. This is the default behavior for getting properties for your JSON. So `getArticalBYId` is called recursively for each `Article` the method obtains. You can just add a `@JsonIgnore` on that method if you want it to be ignored – Paul Samsotha Aug 01 '16 at 05:19
  • Personally I would redesign the model and not put the lookup method in the model. This would be more appropriate in a service. – Paul Samsotha Aug 01 '16 at 05:19
  • @peeskillet Very nice! appreciate your help, let me add my model code. – 林林夕 Aug 01 '16 at 08:34
  • @peeskillet updated, pls check. :) – 林林夕 Aug 01 '16 at 08:36
  • `getArticleById` is being called recursively for each `Article` it returns (ths is causing the stack overflow because it is never-ending). Like I said, Jackson will call your `getXxx` methods to serialize you objects. If you don't want one being called add `@JsonIgnore` on top of the method. – Paul Samsotha Aug 01 '16 at 08:42
  • @peeskillet it is very great, i run successfully, thanks very very much!! – 林林夕 Aug 01 '16 at 10:49
  • There is also new annotations in jackson for exactly this problem. An explanation can be found here; http://stackoverflow.com/questions/3325387/infinite-recursion-with-jackson-json-and-hibernate-jpa-issue – pandaadb Aug 01 '16 at 15:59

0 Answers0