JAX-RS错误发送包含Array的对象为DELETE

时间:2017-01-30 16:50:44

标签: angularjs json jax-rs

我正在设计一个具有拍卖功能的应用程序。前端位于Angularjs,后端使用Glassfish 4上的JAX-RS。

我有一种情况,我想删除用户正在观看的一些拍卖。我将一个容器对象发送到服务器,该服务器包含一个数组,告诉我希望为该用户删除哪些拍卖。

但是,当我发送该对象时,服务器会抛出错误。它显然不喜欢它如何接收对象 - 似乎没有正确地从json转换到JAVA对象。

这是在从angularJS前端发送它之前将对象打印到控制台时的样子:

deleteAuctionWatchlistContainer = {"auctionWatchlistDeleteEntries":[{"auction_id":356,"user_id":2},{"auction_id":225,"user_id":2}]}

这是返回的错误。正如您在config中看到的那样,返回数组,而不是包含它的对象。

Error trying to delete the auction watchlist entries:
{"data":{"errorCode":500},"status":500,"config":        
    {"method":"DELETE","transformRequest":[null],"transformResponse":[null],
    "auctionWatchlistDeleteEntries":[{"auction_id":356,"user_id":2},{"auction_id":225,"user_id":2}],
    "url":"http://localhost:8080/pododdle/webapi/users/2/auctionwatchlist",
    "headers":{"Accept":"application/json, text/plain, */*"}},
"statusText":"Internal Server Error"}

我之前使用过容器对象来做这种事情,但是这次看不出为什么它不起作用。我可以看到资源被正确调用,但是一旦资源试图将json转换为java对象,它就会抛出错误。

容器的JAVA模型如下所示:

@XmlRootElement
public class DeleteAuctionWatchlistsContainer {

    private AuctionWatchlistEntry[] auctionWatchlistDeleteEntries;

    public DeleteAuctionWatchlistsContainer() {

    }

    public AuctionWatchlistEntry[] getAuctionWatchlistDeleteEntries() {
        return auctionWatchlistDeleteEntries;
    }
}

AuctionWatchlistEntry模型的Java是:

@XmlRootElement
public class AuctionWatchlistEntry {

    private int auction_id;
    private int user_id;

    public AuctionWatchlistEntry() {

    }

    public int getAuction_id() {
        return auction_id;
    }

    public int getUser_id() {
        return user_id;
    }
}

以下是拍卖监视列表​​删除的JAX-RS资源:

@DELETE
public Response deleteAuctionWatchlists(DeleteAuctionWatchlistsContainer dAWC)
{
    return Response.ok(auctionWatchlistService.deleteAuctionWatchlistEntries(dAWC.getAuctionWatchlistDeleteEntries()).toString()).build();
}

将对象发送到服务器的angularjs方法保存在angularjs服务中。这是我们称之为服务方法的地方:

var deleteAuctionWatchlistContainer = { auctionWatchlistDeleteEntries: deleteEntries };
pododdle.deleteAuctionWatchlistEntries(deleteAuctionWatchlistContainer).then(onDeleteAuctionWatchlistEntriesComplete, onDeleteAuctionWatchlistEntriesError);

以下是服务方法代码:

var deleteAuctionWatchlistEntries = function(deleteAuctionWatchlistContainer) {
    return $http.delete("http://localhost:8080/pododdle/webapi/users/" + currentUser.user_id + "/auctionwatchlist", deleteAuctionWatchlistContainer)
    .then(function(response) {
        return response.data;
    })          
};

所有人都非常感谢。如果我遗漏了任何相关信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

问题是由@DELETE不接受实体引起的。为了解决这个问题,我使用了一个查询参数,其中包含了我想为特定用途删除的auction_id的分隔字符串。

我确实知道这是否太多了,但是它运行正常并且符合用户期望的行为。