0

I am trying to display JSON data, for that i am using fasterxml jackson. I am able display JSON but the JSON is getting to infinite loop and in log file i am getting error as

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/EAD].[spring]] (http--127.0.0.1-8080-1) Servlet.service() for servlet spring threw exception: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.JsonMappingException$Reference from [Module "deployment.EAD.war:main" from Service Module Loader]

Here is my controller method.

@RequestMapping("/viewDashboard")
@ResponseBody
public ModelMap test(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @RequestParam String name) {

    ModelMap modelMap = new ModelMap();
    List<Instances> instances = viewDashboardServiceImpl.viewDashboard();
    return modelMap.addAllAttributes(instances);

}

Actually my Instance.java is having relation with Application.java and Environment.java

Following are my model.java

Here is my instance.java

@Id
@GeneratedValue
@Column(name = "instanceId")
private long id;

@Column(name = "name")
private String instanceName;

@ManyToOne
@JoinColumn(name = "appId")
private Applications applications;

@ManyToOne
@JoinColumn(name = "enviId")
private Environments environments;

@Column(name = "version")
private String version;

Here is my Application.java

    @Id
@GeneratedValue
@Column(name = "appId")
private long id;

@Column(name = "name")
private String name;

@Column(name = "ownerName")
private String ownerName;

@Column(name = "version")
private String version;

@OneToMany(mappedBy = "applications", targetEntity = Instances.class)
private Set<Instances> instances;

Here is my Environment.java

@Id
@GeneratedValue
@Column(name = "enviId")
private long id;

@Column(name = "name")
private String name;

@Column(name = "ownerName")
private String ownerName;

@Column(name = "version")
private String version;

@OneToMany(mappedBy = "environments", targetEntity = Instances.class)
private Set<Instances> instances;

Here is my JSON

{"instances":{"id":2,"instanceName":"SAP BW DEV1","applications":{"id":1,"name":"SAP","ownerName":"Mou","version":"3.2.1abc","instances":[{"id":2,"instanceName":"SAP BW DEV1","applications":{"id":1,"name":"SAP","ownerName":"Mou","version":"3.2.1abc","instances":[{"id":2,"instanceName":"SAP BW DEV1","applications":{"id":1,"name":"SAP","ownerName":"Mou","version":"3.2.1abc","instances":[{"id":2,"instanceName":"SAP BW DEV1","applications":{"id":1,"name":"SAP","ownerName":"Mou","version":"3.2.1abc","instances":[{"id":2,"instanceName":"SAP BW DEV1","applications":{"id":1,"name":"SAP","ownerName":"Mou","version":"3.2.1abc","instances":[{"id":2,"instanceName":"SAP BW DEV1","applications":{"id":1,"name":"SAP","ownerName":"Mou","version":"3.2.1abc","instances":[{"id":2,"instanceName":"SAP BW DEV1","applications":

As above JSON keeps going on with repeated data. I am having following dependency in maven also.

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.4.5</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.4.5</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.4.5</version>
    </dependency>

And i have added following snippet in servlet.xml also.

    <bean id="contentNegotiationManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
    <property name="favorParameter" value="true" />
    <property name="mediaTypes">
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>
Karthi Krazz
  • 121
  • 1
  • 2
  • 9
  • You have a cyclycal dependency. You are gonna have to annotate some of your collections with `@JsonIgnore` – dambros Apr 14 '16 at 09:57
  • As mentioned above, you've cyclic dependencies and data is available at each level which is causing this infinite. – M.S. Apr 14 '16 at 10:02
  • Thank you all, yes there is cyclic dependency and it is resolved by @JsonIgnore – Karthi Krazz Apr 14 '16 at 10:15
  • @dambros after adding annotation (@JsonIgnore) for variable private Set instances in both application and evironment.java, looping go resolved and new problem came, In json i am getting only the record. Actually i am having 3 records in a table, all three are coming i a list but while converting into JSON i am getting only the last record. – Karthi Krazz Apr 14 '16 at 10:42
  • {"instances":{"id":3,"instanceName":"JAVA","applications":{"id":1,"name":"SAP","ownerName":"Mou","version":"3.2.1abc"},"environments":{"id":1,"name":"DEV1","ownerName":"Mou","version":"1.23.asd"},"version":"2.3as"}} – Karthi Krazz Apr 14 '16 at 10:43
  • But in table i am having three records – Karthi Krazz Apr 14 '16 at 10:43
  • JsonIgnore should have nothing to do with this. Are you sure the list you are serializing has 3 object inside? – dambros Apr 14 '16 at 11:16
  • yes, i am checking list before returning in controller. ModelMap modelMap = new ModelMap(); List instances = viewDashboardServiceImpl.viewDashboard(); log.info(instances.size()); return modelMap.addAllAttributes(instances); In log it showing size as 3 but in JSON i am getting only one record that too last record. – Karthi Krazz Apr 14 '16 at 11:48
  • take a look: http://wiki.fasterxml.com/JacksonFeatureObjectIdentity – Meiko Rachimow Apr 14 '16 at 11:51
  • Even after removing @JsonIgnore annotation, it is taking the last record and keeps on looping. So the JSON mapping is happening only for the last record. – Karthi Krazz Apr 14 '16 at 12:15

0 Answers0