複数のRESTfulWebサービスメソッドから値を取得しています。この場合、Requestメソッドの問題により、2つのメソッドが互いに干渉します。
@GET
@Path("/person/{name}")
@Produces("application/xml")
public Person getPerson(@PathParam("name") String name) {
System.out.println("@GET /person/" + name);
return people.byName(name);
}
@POST
@Path("/person")
@Consumes("application/xml")
public void createPerson(Person person) {
System.out.println("@POST /person");
System.out.println(person.getId() + ": " + person.getName());
people.add(person);
}
次のコードを使用してcreatePerson()メソッドを呼び出そうとすると、Glassfishサーバーの結果は「@GET /person/で人を作成しようとしている名前」になります。これは、{name}パラメーターを送信しなかった場合でも@GETメソッドが呼び出されることを意味します(コードで確認できます)。
URL url = new URL("http://localhost:8080/RESTfulService/service/person");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Accept", "application/xml");
connection.setDoOutput(true);
marshaller.marshal(person, connection.getOutputStream());
私はこれが私のコードを掘り下げることをたくさん求めていることを知っていますが、この場合私は何を間違っているのですか?
アップデート
createPersonはvoidであるため、connection.getInputStream()を処理しません。これにより、実際にはリクエストが私のサービスによって処理されないようになります。
しかし、実際のリクエストはconnection.getOutputStream()で送信されますよね?
更新2
RequestMethodは、戻り値を持つメソッド、つまりconnection.getOutputStream()を処理する限り、機能します。voidを呼び出して、connection.getOutputStream()を処理しようとしないと、サービスは要求を受信しません。