0

私は JavaEE と Web サービスには比較的慣れていませんが、netbeans を使用してクライアントと Web サービスのリソースを生成しています。mysql データベース テーブルを表すリソース「CustomerData」と、そのテーブルの列を表す値「rewardsPoints」がありますが、ConstraintViolationException が原因で値を更新できません。具体的には次のとおりです。

javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'preUpdate'. Please refer to embedded ConstraintViolations for details.

「preUpdate」コールバック イベントに慣れていません。オーバーライドする必要がありますか? この例外がスローされる理由を正確に理解できないようですが、前述したように、私は Web サービス プログラミングに非常に慣れていません。ここに私のクラスがあります:

@Stateless
@Path("customers")
public class CustomerDataFacadeREST extends AbstractFacade<CustomerData> {
    @PersistenceContext(unitName = "CustomerPortalPU")
    private EntityManager em;
    public CustomerDataFacadeREST() {
        super(CustomerData.class);
    }

    @PUT
    @Path("{id}")
    @Consumes({"application/xml", "application/json"})
    public void edit(@PathParam("id") Integer id, CustomerData entity) {
        super.edit(entity);
    }

    @GET
    @Path("{id}")
    @Produces({"application/xml", "application/json"})
    public CustomerData find(@PathParam("id") Integer id) {
        return super.find(id);
    }
    @GET
    @Path("addPoints/{id}/{amount}")
    @Produces({"text/plain"})
    public String addPoints(@PathParam("id") Integer id, @PathParam("amount") int amount) {
        CustomerData customer = find(id);
    customer.getRewardsPoints(customer.getRewardsPoints() + amount);
    em.persist(customer);
    edit(customer);
    return customer.getRewardsPoints();
    }
    @Override
    protected EntityManager getEntityManager() {
        return em;
    }
}

そして、CustomerData エンティティ クラス:

@Entity
@Table(name = "tbl_customer_data")
@XmlRootElement
public class CustomerData implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Column(name = "rewards_points")
    private int rewardsPoints;
    public CustomerData(Integer id, int rewardsPoints) {
        this.id = id;
        this.rewardsPoints = rewardsPoints;
    }   
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public int getRewardsPoints() {
        return rewardsPoints;
    }
    public void setRewardsPoints(int rewardsPoints) {
        this.rewardsPoints = rewardsPoints;
    }
}

URI にアクセスしようとすると:

http://localhost:8080/CustomerPortal/ws/customers/addPoints/1/5 

ID 1 のユーザーに 5 ポイントを追加するには、HTTP 500 エラーが発生し、glassfish ログに次のように表示されます

[2013-11-05T03:28:11.733-0500] [glassfish 4.0] [WARNING] [ejb.system_exception] [javax.enterprise.system.container.ejb.com.sun.ejb.containers] [tid: _ThreadID=21 _ThreadName=http-listener-1(3)] [timeMillis: 1383640091733] [levelValue: 900] [[
  EJB5184:A system exception occurred during an invocation on EJB CustomerDataFacadeREST, method: public java.lang.String com.webservice.entities.CustomerDataFacadeREST.addPoints(java.lang.Integer,int)]]

[2013-11-05T03:28:11.741-0500] [glassfish 4.0] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=21 _ThreadName=http-listener-1(3)] [timeMillis: 1383640091741] [levelValue: 900] [[
  StandardWrapperValve[com.webservice.entities.ApplicationConfig]: Servlet.service() for servlet com.webservice.entities.ApplicationConfig threw exception
javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'preUpdate'. Please refer to embedded ConstraintViolations for details.

この問題に関するリソース、洞察、または情報は非常に役立ちます。

4

1 に答える 1

0

この例外は Web サービスとはほとんど関係がなく、代わりにBean Validationと関係があります。

この場合、 Validation がメソッド内で失敗するためaddPoints(スタック トレースを参照)、それを引き起こす可能性がある唯一の行は、 type の Entity を永続化または編集する場合CustomerDataです。そのクラスにある唯一の制約は、rewardsPointsnull であってはならないということです。だから、それが例外の原因です。

addPointsただし、メソッドでは機能しないことがいくつかあります。

  • find() メソッドが null オブジェクトを返さないことを確認する必要があります。
  • customer.getRewardsPoints(customer.getRewardsPoints() + amount)プロパティを設定しません (コンパイルしますか?)
  • EntityManager.persist()エンティティが既に存在する場合は例外をスローします。エンティティのみを編集 (更新) する場合は、おそらくその行を削除する必要があります。

注: あなたが投稿したコードが実際にコンパイルされ、その例外を引き起こしているかどうかはわかりません。それはおそらく別のバージョンが原因です。

于 2013-11-05T09:24:23.457 に答える