2017-01-30 9 views
0

Я разрабатываю приложение с функцией аукциона. Интерфейс находится в Angularjs, а бэкэнд использует JAX-RS на Glassfish 4.JAX-RS ошибка отправки объекта, содержащего массив, в DELETE

У меня есть ситуация, когда я хочу удалить несколько аукционов, которые просматривает пользователь. Я отправляю контейнерный объект на сервер, содержащий массив, в котором указаны аукционы, которые я хочу удалить для этого пользователя.

Однако сервер посылает сообщение об ошибке при отправке этого объекта. Очевидно, что им не нравится, как он получает объект - он, кажется, не правильно переносится с 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; 
    } 
} 

Java-для модели AuctionWatchlistEntry является:

@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, который отправляет объект на сервер, находится внутри угловой. Здесь мы вызываем метод службы:

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

Вы используете jackson для отображения jaxb аннотаций на json? Вы зарегистрировали поставщика json? Почему DeleteAuctionWatchlistsContainer не имеет аннотации XmlRootElement? Что такое серверный журнал? – pedrofb

+0

Я добавил к XmlRootElement в DeleteAuctionWatchlistContainer - это было отличное место. Но ошибка остается прежней. Ресурс, содержащий метод @DELETE, имеет @Consumes (MediaType.APPLICATION_JSON). Журнал сервера ничего не сообщает. У меня есть System.out.println внутри метода удаления, который печатает, но он ничего не делает, как только он пытается получить доступ к объекту Container .... –

ответ

0

Проблема была вызвана тем, что @DELETE не принимает объект. Чтобы обойти это, я использовал параметр запроса, который включал разделительную строку auction_id, которую я хочу удалить для конкретного использования.

Я знаю, если это слишком много взлома, но оно отлично работает и подходит для желаемого поведения пользователя.