2017-12-01 13 views
1

私はこれをdropwizard exampleとして使用しようとしています。私は、適切なゲッターとセッターを加え、そして方法に等しく入力ストリームからエンティティを読み取るときにエラーが発生しました。Dropwizardの例

public class Person { 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private long id; 

@Column(name = "fullName", nullable = false) 
private String fullName; 

@Column(name = "jobTitle", nullable = false) 
private String jobTitle; 

@Column(name = "userName", nullable = false) 
private String userName; 

public Person() { 
} 

public Person(String fullName, String jobTitle, String userName) { 
    this.fullName = fullName; 
    this.jobTitle = jobTitle; 
    this.userName = userName; 
} 

以下のようPerson.javapeople表に列userNameを追加しようとしました。

しかし、このブロックの入力ストリームからエンティティを読み取る際にエラーが発生します。

@Test 
public void testPostPerson() throws Exception { 
    final Person person = new Person("Dr. IntegrationTest", "Chief Wizard", "Dr. Wizard"); 
    final Person newPerson = RULE.client().target("http://localhost:" + RULE.getLocalPort() + "/people") 
      .request() 
      .post(Entity.entity(person, MediaType.APPLICATION_JSON_TYPE)) 
    --> .readEntity(Person.class); 
    assertThat(newPerson.getId()).isNotNull(); 
    assertThat(newPerson.getFullName()).isEqualTo(person.getFullName()); 
    assertThat(newPerson.getJobTitle()).isEqualTo(person.getJobTitle()); 
    assertThat(newPerson.getUserName()).isEqualTo(person.getUserName()); 
} 

入力ストリームのエラーは、次

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
Unrecognized field "code" (class com.example.helloworld.core.Person), not marked as ignorable (4 known properties: "fullName", "id", "userName", "jobTitle"]) 

クラスレベルで@JsonIgnoreProperties注釈はこの問題を解決することによって引き起こされますか?この安全な練習ですか?

EDIT:PersonResource.java

@Path("/people/{personId}") 
@Produces(MediaType.APPLICATION_JSON) 
public class PersonResource { 

private final PersonDAO peopleDAO; 

public PersonResource(PersonDAO peopleDAO) { 
    this.peopleDAO = peopleDAO; 
} 

@GET 
@UnitOfWork 
public Person getPerson(@PathParam("personId") LongParam personId) { 
    return findSafely(personId.get()); 
} 

@GET 
@Path("/view_freemarker") 
@UnitOfWork 
@Produces(MediaType.TEXT_HTML) 
public PersonView getPersonViewFreemarker(@PathParam("personId") LongParam personId) { 
    return new PersonView(PersonView.Template.FREEMARKER, findSafely(personId.get())); 
} 

@GET 
@Path("/view_mustache") 
@UnitOfWork 
@Produces(MediaType.TEXT_HTML) 
public PersonView getPersonViewMustache(@PathParam("personId") LongParam personId) { 
    return new PersonView(PersonView.Template.MUSTACHE, findSafely(personId.get())); 
} 

private Person findSafely(long personId) { 
    return peopleDAO.findById(personId).orElseThrow(() -> new NotFoundException("No such user.")); 
} 
+0

あなたのリソースメソッドを引用できますか?要求がPersonオブジェクトではなく無効な応答を受け取っているようです。 –

+0

updated @CanBican – DJ2

答えて

1

私は、リソースが失敗し、Webアプリケーションの例外をスローし、コードが実際にHTTPステータスコードであるからだと思います。

はこのようにそれを試してみてください。

Response response = RULE.client().target("http://localhost:" + RULE.getLocalPort() + "/people") 
     .request() 
     .post(Entity.entity(person, MediaType.APPLICATION_JSON_TYPE)); 
assertEquals(200, response.getStatus()); 
Person newPerson = response.readEntity(Person.class); 
.... 

あなたはまた、次のようにデバッグすることがあります。あなたのレスポンスのボディをダンプします

String responseString = response.readEntity(String.class); 

を。

+0

hmmmこれは変更の結果ですjava.lang.AssertionError:expected:<200>しかし:<500> – DJ2

+1

私はあなたにシリアライズの問題について質問していると思っていました。あなたがあなたの質問にそれをスキップしていない場合@POSTで注釈が付いたメソッド、それは問題です。この特定のテストを成功させるためのポスト・クエリーを処理できる方法が必要です。 –

関連する問題