У меня есть 2 метода restful service getCustomerJson и getCustomerXML в классе CustomerResource, где я использую jersey API для Restful Webservices. Все параметры двух методов одинаковы, кроме одного, выдает xml, а другой - json.HTTP GET-запрос с правильным типом контента не ударяет по ожидаемому методу службы
Когда я использую HTTP-запрос GET с заголовком Content-Type = "application/json", он всегда вызывает метод getCustomerXML, который возвращает xml.
Может ли кто-нибудь объяснить мне, как джерси работает в подобной ситуации?
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
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;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import domain.Customer;
@Path("/customers")
public class CustomerResource {
private static Map<Integer, Customer> customerDB = new ConcurrentHashMap<Integer, Customer>();
private static AtomicInteger idCounter = new AtomicInteger();
// Constructor
public CustomerResource() {
}
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHello() {
return "Hello Kundan !!!";
}
@GET
@Path("{id}")
@Produces("application/xml")
public Customer getCustomerXML(@PathParam("id") int id, @Context HttpHeaders header) {
final Customer customer = customerDB.get(id);
List<String> contentList = header.getRequestHeader("Content-Type");
List<String> languageList = header.getRequestHeader("Accept-Language");
List<String> compressionFormatList = header.getRequestHeader("Content-Type");
if (customer == null) {
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
return customer;
}
@GET
@Path("{id}")
@Produces("application/json")
public Customer getCustomerJson(@PathParam("id") int id) {
final Customer customer = customerDB.get(id);
if (customer == null) {
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
return customer;
}
@POST
@Consumes("application/xml")
public Response createCustomer(Customer customer) {
customer.setId(idCounter.incrementAndGet());
customerDB.put(customer.getId(), customer);
System.out.println("Created customer " + customer.getId());
return Response.created(URI.create("/customers/" + customer.getId())).build();
}
@PUT
@Path("{id}")
@Consumes("application/xml")
public void updateCustomer(@PathParam("id") int id, Customer customer) {
Customer current = customerDB.get(id);
if (current == null)
throw new WebApplicationException(Response.Status.NOT_FOUND);
current.setFirstName(customer.getFirstName());
current.setLastName(customer.getLastName());
current.setStreet(customer.getStreet());
current.setCity(customer.getCity());
current.setState(customer.getState());
current.setZip(customer.getZip());
current.setCountry(customer.getCountry());
}
@DELETE
@Path("{id}")
public void deleteCustomer(@PathParam("id") int id) {
customerDB.remove(id);
System.out.println("Deleted !");
}
}
И прежде чем вы даже зададите этот вопрос, если вы получите сообщение об ошибке для no applicationBodyWriter для типа application/json, это означает, что вам нужен поставщик JSON. Вам нужно искать вокруг. Это вопрос не по теме для этого вопроса. Если вы не получаете эту ошибку, и все работает, то просто забудьте этот комментарий :-) –