1

このチュートリアルを使用して、Netbean 7.3.1 を使用して単純な Java EE 7 Web サービスを作成しています。

正常に実行されました。GET、PUT、POST、DELETE を使用してテストしています。POSTを除いて、3つすべてが正常に機能しています。

ID を含むこの json データを投稿していますが、これは正常に機能します。

{"id":"2","address1":"pe3","address2":"address line1","address3":"Address line3","city":"City Name","town":"Town Name","country":"uk","postcode":"123123"}

しかし、私のIDは自動インクリメントであるため、IDなしで次のjsonをPOSTすると、次のエラーで失敗します

{"address1":"pe3","address2":"address line1","address3":"Address line3","city":"City Name","town":"Town Name","country":"uk","postcode":"123123"}

エラーは

HTTP Status 400 - Bad Request

type Status report

messageBad Request

descriptionThe request sent by the client was syntactically incorrect.
GlassFish Server Open Source Edition 4.0

POSTの送信中にデータベースで自動インクリメントタイプのIDを送信する必要がある理由を誰かが説明できますか? 回避策はありますか?

エンティティクラスのコードは

.......
        @Id
        @Basic(optional = false)
        @NotNull
        @Column(name = "id")
        private Integer id;

        @Size(max = 45)
        @Column(name = "address1")
        private String address1;

        @Size(max = 45)
        @Column(name = "address2")
........

AddressFacadeREST.java クラスは次のようになります。

package entities.service;

import entities.Address;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;


@Stateless
@Path("entities.address")
public class AddressFacadeREST extends AbstractFacade<Address> {
    @PersistenceContext(unitName = "CustomerDBPU")
    private EntityManager em;

    public AddressFacadeREST() {
        super(Address.class);
    }

    @POST
    @Override
    @Consumes({"application/xml", "application/json"})
    public void create(Address entity) {
        super.create(entity);
    }

    @PUT
    @Override
    @Consumes({"application/xml", "application/json"})
    public void edit(Address entity) {
        super.edit(entity);
    }

    @DELETE
    @Path("{id}")
    public void remove(@PathParam("id") Integer id) {
        super.remove(super.find(id));
    }

    @GET
    @Path("{id}")
    @Produces({"application/xml", "application/json"})
    public Address find(@PathParam("id") Integer id) {
        return super.find(id);
    }

    @GET
    @Override
    @Produces({"application/xml", "application/json"})
    public List<Address> findAll() {
        return super.findAll();
    }

    @GET
    @Path("{from}/{to}")
    @Produces({"application/xml", "application/json"})
    public List<Address> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) {
        return super.findRange(new int[]{from, to});
    }

    @GET
    @Path("count")
    @Produces("text/plain")
    public String countREST() {
        return String.valueOf(super.count());
    }

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

}
4

1 に答える 1

1

このエラーは、提供された json をエンティティ クラスのインスタンスに変換できない jax-rs サービスによって生成されます。NetBeans がエンティティ クラスとサービス ファサードを作成する方法に基づいて、エンティティ クラスには空でないコンストラクタが 1 つだけあり、入力パラメータとして id が必要です。さらに、クラスに@NotNull注釈があります。@Idもしそうなら:

  • プロパティを除くすべてのエンティティ プロパティを受け取るコンストラクターを作成し@Idます。このようにして、サービスは着信 json をエンティティ クラスのインスタンスに変換できます。
  • @NotNull新しいエンティティーを永続化するときに JavaBeans Validator がエラーを発生させないようにするために、アノテーションを削除してください。
于 2013-08-21T18:00:01.857 に答える