Tengo una simple WS que es un @PUT y toma un objeto

@Path("test")
public class Test {

    @PUT
    @Path("{nid}"}
    @Consumes("application/xml")
    @Produces({"application/xml", "application/json"})
    public WolResponse callWol(@PathParam("nid") WolRequest nid) {
        WolResponse response = new WolResponse();
        response.setResult(result);
        response.setMessage(nid.getId());

        return response;
    }

y mi lado del cliente código es…

WebResource wr = client.resource(myurl);
WolResponse resp = wr.accept("application/xml").put(WolResponse.class, wolRequest);

Estoy tratando de pasar una instancia de WolRequest en el @PUT Webservice. Estoy recibiendo constantemente 405 errores tratando de hacer esto..

¿Cómo puedo pasar un objeto desde el cliente al servidor a través de Jersey ? ¿Puedo usar una consulta param o la solicitud ?

Tanto mi POJOs (WolRequest y WolResponse) tienen la XMlRootElement etiqueta definida para que yo pueda producir y consumir xml..

  • 405 es el «método no permitido». ¿Usted necesita para configurar su servidor web para permitir que PONER?
InformationsquelleAutor matchan | 2010-01-02

5 Comentarios

  1. 1

    Creo que el uso de la @PathParam no es correcto aquí. Un @PathParam es básicamente puede ser una Cadena (ver su javadoc para obtener más información).

    Puede 1) el uso de la @PathParam como un parámetro de Cadena o 2) no definen WolRequest como @PathParam.

    1)

    @Path("test")
    public class Test {
    
        @PUT
        @Path("{nid}"}
        @Consumes("application/xml")
        @Produces({"application/xml", "application/json"})
        public WolResponse callWol(@PathParam("nid") String nid) {
            WolResponse response = new WolResponse();
            response.setResult(result);
            response.setMessage(nid);
    
            return response;
        }

    Este acepta urls como: «text/12», 12 será la Cadena de nid. No parece que esto va a ayudar a lo que usted está tratando de hacer.

    o

    2)

    @Path("test")
    public class Test {
    
        @PUT
        @Consumes("application/xml")
        @Produces({"application/xml", "application/json"})
        public WolResponse callWol(WolRequest nid) {
            WolResponse response = new WolResponse();
            response.setResult(result);
            response.setMessage(nid.getId());
    
            return response;
        }

    Su código de cliente puede ser como se especifica, sólo la url para PONER es: «prueba». Tal vez usted necesita una combinación de ambos, uno @PathParam para su identificación y uno «normal» de los parámetros para obtener su solicitud de datos.

    Espero que esto ayude.

  2. 1

    Revise este enlace http://www.vogella.de/articles/REST/article.html

    Como por el ejemplo de código del método putTodo de clase TodoResource ,
    el código debe ser como este.

    @Path("test")
    public class Test{
    
        @PUT
        @Consumes("application/xml")
        @Produces({"application/xml", "application/json"})
        public WolResponse callWol(JAXBElement<WolRequest> nid) {
            WolResponse response = new WolResponse();
            response.setResult(result);
            response.setMessage(nid.getValue().getId());
    
            return response;
       }
    }

    La esperanza de que esto va a resolver su problema.

    Saludos

  3. 0

    Usted puede intentar algo como esto

    @POST
    @Path("/post")
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    public Response callWol(WolRequest nid) {
         WolResponse response = new WolResponse();
         response.setResult(result);
         response.setMessage(nid.getValue().getId());
         return Response.status(Status.OK).entity(response).build();
    }

    Puede intentar @PONER en lugar de @Post así. Espero que esto ayude

  4. 0

    Yo tenía el mismo problema que he resuelto en 3 Pasos con Jackson en Netbeans/Glashfish btw.

    1)Requisitos :

    algunos de los Frascos he utilizado :

     commons-codec-1.10.jar
     commons-logging-1.2.jar
     log4j-1.2.17.jar
     httpcore-4.4.4.jar
     jackson-jaxrs-json-provider-2.6.4.jar
     avalon-logkit-2.2.1.jar
     javax.servlet-api-4.0.0-b01.jar
     httpclient-4.5.1.jar
     jackson-jaxrs-json-provider-2.6.4.jar
     jackson-databind-2.7.0-rc1.jar
     jackson-annotations-2.7.0-rc1.jar
     jackson-core-2.7.0-rc1.jar

    Si me he perdido ninguna de las frasco de arriba , se puede descargar desde Maven aquí http://mvnrepository.com/artifact/com.fasterxml.jackson.core

    2)de la Clase Java a la que envía su Correo.
    En primer lugar ,Convertir con Jackson la Entidad de Usuario para Json y luego enviarlo a su Resto de la Clase.

    import com.fasterxml.jackson.databind.ObjectMapper;
    import ht.gouv.mtptc.siiv.model.seguridad.Usuario;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.simple.JSONObject;
    public class PostRest {
    public static void main(String args[]) throws UnsupportedEncodingException, IOException {
    //1. create HttpClient
    DefaultHttpClient httpclient = new DefaultHttpClient();
    //2. make POST request to the given URL
    HttpPost httpPost 
    = new HttpPost("http://localhost:8083/i360/rest/seguridad/obtenerEntidad");
    String json = "";
    Usuario u = new Usuario();
    u.setId(99L);
    //3. build jsonObject
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("id", u.getId());
    //4. convert JSONObject to JSON to String
    //json = jsonObject.toString();
    //** Alternative way to convert Person object to JSON string usin Jackson Lib
    //ObjectMapper mapper = new ObjectMapper();
    //json = mapper.writeValueAsString(person);
    ObjectMapper mapper = new ObjectMapper();
    json = mapper.writeValueAsString(u);
    //5. set json to StringEntity
    StringEntity se = new StringEntity(json,"UTF-8");
    //6. set httpPost Entity
    httpPost.setEntity(se);
    //7. Set some headers to inform server about the type of the content   
    httpPost.setHeader("Accept", "application/json");
    httpPost.setHeader("Content-type", "application/json");
    //8. Execute POST request to the given URL
    HttpResponse httpResponse = httpclient.execute(httpPost);
    //9. receive response as inputStream
    //inputStream = httpResponse.getEntity().getContent();
    }
    }

    3)de la Clase Java de Descanso en la que desea recibir la Entidad JPA/Hibernate .
    Aquí con su MediaType.APPLICATION_JSON que usted reciba de la Entidad de esta forma :

    «»id»:99,»usuarioPadre»:null,»nickname»:null,»clave»:null,»nombre»:null,»apellidos»:null,»isLoginWeb»:null,»isLoginMovil»:null,»estado»:null,»correoElectronico»:null,»imagePerfil»:null,»perfil»:null,»urlCambioClave»:null,»telefono»:null,»celular»:null,»isFree»:null,»proyectoUsuarioList»:null,»cuentaActiva»:null,»keyUser»:null,»isCambiaPassword»:null,»videoList»:null,»idSocial»:null,»tipoSocial»:null,»idPlanActivo»:null,»cantidadMbContratado»:null,»cantidadMbConsumido»:null,»cuotaMb»:null,»fechaInicio»:null,»fechaFin»:null}»

        import javax.ws.rs.Consumes;
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import org.json.simple.JSONArray;
    import org.json.simple.JSONObject;
    import org.apache.log4j.Logger;
    @Path("/seguridad")
    public class SeguridadRest implements Serializable {
    @POST
    @Path("obtenerEntidad")
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONArray obtenerEntidad(Usuario u) {
    JSONArray array = new JSONArray();
    LOG.fatal(">>>Finally this is my entity(JPA/Hibernate) which 
    will print the ID 99 as showed above :" + u.toString());
    return array;//this is empty
    }
    ..

    Algunos consejos : Si usted tiene problema con el funcionamiento de la web después de usar este código puede ser debido a la @Consumes in XML … se debe establecer como @Consumes(MediaType.APPLICATION_JSON)

  5. 0

    Probar este funcionará

    Lado Del Servidor:

    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    public String addRecord(CustomClass mCustomClass)
    {
    ///
    ///
    ///
    return "Added successfully : "+CustomClass.getName();
    }//addRecord

    Lado Del Cliente:

    public static void main(String[] args)
    {
    ///
    ///
    ///
    CustomClass mCustomClass = new CustomClass();
    Client client = ClientBuilder.newClient();
    String strResult = client.target(REST_SERVICE_URL).request(MediaType.APPLICATION_XML).put(Entity.xml(mCustomClass), String.class);
    }

Dejar respuesta

Please enter your comment!
Please enter your name here