Я объявил две веб-службы REST. Тот, который просто возвращает объект. И другое, которое принимает объект и возвращает другой объект. Используется POJO Order.java.
@XmlRootElement
public class Order {
private String id;
private String description;
public Order() {
}
@XmlElement
public String getId() {
return id;
}
@XmlElement
public String getDescription() {
return description;
}
// Other setters and methods
}
Webservice определяется как
@Path("/orders")
public class OrdersService {
// Return the list of orders for applications with json or xml formats
@Path("/oneOrder")
@GET
@Produces({MediaType.APPLICATION_JSON})
public Order getOrder_json() {
System.out.println("inside getOrder_json");
Order o1 = OrderDao.instance.getOrderFromId("1");
System.out.println("about to return one order");
return o1;
}
@Path("/writeAndIncrementOrder")
@GET
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public Order writeAndIncrementOrder(Order input) {
System.out.println("inside writeAndIncrementOrder");
Order o1 = new Order();
o1.setId(input.getId()+1000);
o1.setDescription(input.getDescription()+"10000");
System.out.println("about to return one order");
return o1;
}
Я мог написать код клиента, чтобы вызвать веб-службу, которая ничего не принимает, но возвращает объект. Код клиента выглядит следующим образом
import java.net.URI;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.jersey.client.ClientConfig;
public class Test {
public static void main(String[] args) {
WebTarget target2 = client.target(getBaseURI()).path("rest").path("orders");
String o2 = target2.path("oneOrder").request().accept(MediaType.APPLICATION_JSON).get(String.class);
System.out.println(o2);
}
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost:8090/FirstRESTProject").build();
}
Но я не понимаю, как вызвать другую службу, которая принимает, а также возвращает объект. Я пробовал разные решения в Интернете. Но для меня ничего не работало. Некоторое решение работает только для отправки объекта, а некоторые работают только для принятия. Но ни один из них не работал для выполнения обоих вызовов.
ИЗМЕНИТЬ Как было предложено ниже, я зарегистрировал JacksonJaxbJsonProvider.class. Но автоматическое преобразование в объект Order не происходит.
String o2 = target2.path("oneOrder").request().accept(MediaType.APPLICATION_JSON).get(String.class);
client.register(JacksonJaxbJsonProvider.class);
Order o4 = target2.path("oneOrder").request().accept(MediaType.APPLICATION_JSON).get(Order.class);
В вышеприведенной программе я успешно получаю строку как { "id": "1", "description": "Это 1-й порядок" } Но получение прямой ошибки объекта вызывает ошибку MessageBodyReader не найден для типа media = application/json, type = class shopping.cart.om.Order, genericType = класс shopping.cart.om.Order.