如何使用Spring Boot Restful API解决Jackson MismatchedInputExeption和无限递归?

时间:2019-05-27 04:38:20

标签: java hibernate spring-boot jackson

我正在研究带有Spring Boot和Hibernate的Restful API。 因此,我尝试使用JUnit测试我的学习API。 但是,会发生错误。 (它将显示在下面。)

我在StackOverflow中发现了相同的问题,并尝试了。 但是,它们仍然存在。 当我在User类的site变量上使用.native时,会发生另一个错误。

这是我的模型课程。

@JsonManagedReference
@Entity
@Table(name = "users")
@EntityListeners(AuditingEntityListener.class)
public class User {
    private String username;
    private String password;
    private List<Site> sites = new ArrayList<Site>();

    public User() {

    }

    public User(String username, String password) {
        setUsername(username);
        setPassword(password);
    }

    @Id
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Column(name = "password", nullable = false)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @OneToMany(cascade = CascadeType.ALL)
    public List<Site> getSites() {
        return sites;
    }

    public void setSites(List<Site> sites) {
        this.sites = sites;
    }

    public void addSite(Site site) {
        this.sites.add(site);
    }
}

这是我的测试代码。

@Entity
@Table(name = "sites")
@EntityListeners(AuditingEntityListener.class)
@IdClass(Site.class)
//@JsonDeserialize(as = User.class)
public class Site implements Serializable{
    private long id;
    private User user;
//  private String username;
    private String siteURL;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @ManyToOne
    @JoinColumn(name="username", referencedColumnName = "username")
    @JsonIgnoreProperties
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

//  @Column(name="username")
//  public String getUsername() {
//      return username;
//  }
//
//  public void setUsername(String username) {
//      this.username = username;
//  }

    @Column(name = "siteURL", nullable = false)
    public String getSiteURL() {
        return siteURL;
    }

    public void setSiteURL(String siteName) {
        this.siteURL = siteName;
    }
}

这是第一个错误代码。 (它可能具有无限递归。)

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class userTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @LocalServerPort
    private int port;

    private String getRootUrl() {
        return "http://localhost:" + port;
    }

    @Test
    public void contextLoads() {

    }

    ......

    @Test
    public void createDataset() {
//      List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
//      // Add the Jackson Message converter
//      MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
//      // Note: here we are making this converter to process any kind of response,
//      // not only application/*json, which is the default behaviour
//      converter.setSupportedMediaTypes(Collections.singletonList(
////                MediaType.APPLICATION_JSON_UTF8
////                MediaType.APPLICATION_ATOM_XML
////                MediaType.APPLICATION_FORM_URLENCODED 
////                MediaType.APPLICATION_JSON
////                MediaType.APPLICATION_OCTET_STREAM 
////                MediaType.APPLICATION_PDF
////                MediaType.APPLICATION_PROBLEM_JSON
////                MediaType.APPLICATION_PROBLEM_JSON_UTF8 
////                MediaType.APPLICATION_PROBLEM_XML
////                MediaType.APPLICATION_RSS_XML
//              MediaType.APPLICATION_STREAM_JSON 
////                MediaType.APPLICATION_XHTML_XML
//              ));
//      messageConverters.add(converter);
//      restTemplate.getRestTemplate().setMessageConverters(messageConverters);

        Site site1 = new Site();
        site1.setSiteURL("www.t3q.com");
        Site site2 = new Site();
        site2.setSiteURL("www.t3q1.com");

        User user1 = new User();
        user1.setUsername("1111");
        user1.setPassword("12131");

        user1.addSite(site1);
        user1.addSite(site2);

//      site1.setUser(user1);
//      site2.setUser(user1);

        User user2 = new User();
        user2.setUsername("2222");
        user2.setPassword("1241");

        Site site3 = new Site();
        site3.setSiteURL("www.t3q.com");

        user2.addSite(site3);

//      site3.setUser(user2);

        restTemplate.postForEntity(getRootUrl() + "/users", user1, User.class);
        restTemplate.postForEntity(getRootUrl() + "/users", user2, User.class);

//      restTemplate.postForEntity(getRootUrl() + "/sites", site1, Site.class);
//      restTemplate.postForEntity(getRootUrl() + "/sites", site2, Site.class);
//      restTemplate.postForEntity(getRootUrl() + "/sites", site3, Site.class);

        User calledUser1 = restTemplate.getForObject(getRootUrl() + "/users/" + user1.getUsername(), User.class);
        System.out.println("Username: " + calledUser1.getUsername() + ", Password: " + calledUser1.getPassword());
        for (Site site : calledUser1.getSites()) {
            System.out.println("Sign up site: " + site.getSiteURL());
        }
        User calledUser2 = restTemplate.getForObject(getRootUrl() + "/users/" + user2.getUsername(), User.class);
        System.out.println("Username: " + calledUser2.getUsername() + ", Password: " + calledUser2.getPassword());
        for (Site site : calledUser2.getSites()) {
            System.out.println("Sign up site: " + site.getSiteURL());
        }
    }
}

这是另一条错误消息。使用org.springframework.web.client.RestClientException: Error while extracting response for type [class com.t3q.userMange.model.User] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 79891] (through reference chain: com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["password"]) at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:117) at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:995) at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:978) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:737) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:670) at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:445) at org.springframework.boot.test.web.client.TestRestTemplate.postForEntity(TestRestTemplate.java:506) at userTest.userTest.createDataset(userTest.java:171) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209) Caused by: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 79891] (through reference chain: com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]- at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:245) at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:227) at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:102) ... 38 more Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 79891] (through reference chain: com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]->com.t3q.userMange.model.Site["user"]->com.t3q.userMange.model.User["sites"]->java.util.ArrayList[0]- 时。

@JsonManagedReference

如何解决此问题? 救救我。

0 个答案:

没有答案