Erro HTTP 400 no serviço da web REST durante o POST com FormParam contendo objetos próprios (por exemplo, enities)
Para um processo de encomenda no meu serviço REST, tenho de enviar uma lista de "artigos" do cliente para o servidor. Esses objetos de artigo são de um tipo de entidade própria. Eu já descobri que enviar uma lista de objetos STRING ou INTEGER funciona, enviando-a via @FormParam.
Mas assim que eu tento enviar uma lista de meus próprios objetos (mesmo que apenas UM objeto), eu sempre recebo umErro HTTP 400 "Solicitação incorreta".
Eu tentei exatamente o mesmo código como abaixo (apenas os parâmetros de form.add () e os parâmetros do método do servidor foram alterados) e postet Strings, Integers e listas de Strings com sucesso. Apenas cria problemas ao enviar tipos de objetos próprios.
O log me disse que o método do servidor não foi atingido. O processo está quebrado em algum lugar antes.
Eu também tentei obter o pedido usando um proxy (Apache JMeter). Aqui diz que o parâmetrokunde
contém o valorentities.Kunde%40af8358
. Então eu acho que o objeto não é serializado completamente (ou de todo). Mas enviar este tipo de objeto de servidor para cliente em uma resposta funciona bem - aqui a serialização XML não é problema.
O que pode ser a razão? É possível NÃO enviar tipos próprios através do POST?
(PS: o tipoKunde
no meu exemplo é serializável e anotado com@XmlRootElement
.)
Agradeço antecipadamente por sua ajuda!
Jana
Nota: Estou usando o SAP Netweaver AS. Mas até agora ele se comportou como qualquer outro Java AS, então eu não acho que esse seja o motivo. Todas as outras operações REST funcionam, até mesmo POST sem entidades próprias.
Adição: Estou usando a biblioteca JERSEY.
Meu código no lado do servidor:
@Path("/test")
@POST
@Produces(MediaType.TEXT_XML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public String test(
@FormParam("kunde") Kunde kunde) {
return "The name of the customer is: "
+kunde.getVorname()+" "+kunde.getNachname();
}
Meu código no lado do cliente (o método está em um Session Bean):
public String test() {
Kunde kunde = new Kunde();
kunde.setNachname("Müller");
kunde.setVorname("Kurt");
Form form = new Form();
form.add("kunde", kunde);
return service
.path("test")
.type(MediaType.APPLICATION_FORM_URLENCODED)
.accept(MediaType.TEXT_XML)
.post(String.class, form);
}
Ondeserviço é construído assim:
com.sun.jersey.api.client.Client;
com.sun.jersey.api.client.WebResource;
com.sun.jersey.api.client.config.ClientConfig;
com.sun.jersey.api.client.config.DefaultClientConfig;
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
service = client.resource(UriBuilder.fromUri("<service-url>").build());