Estoy desarrollando algunos servicios restful con la Primavera. Tengo problemas con el pasar de los/obtención de matriz de cadena o de grandes cadenas como parámetros para mi controlador de servicio. Mi código de ejemplos como el de abajo;

Controlador:

@RequestMapping(value="/getLocationInformations/{pointList}", method=RequestMethod.GET)
@ResponseBody
public LocationInfoObject getLocationInformations(@PathVariable("pointList") String pointList)
{
    //code block
}

Ejemplo de lista de puntos:

String pointList = "37.0433;35.2663,37.0431;35.2663,37.0429;35.2664,37.0428;35.2664,37.0426;35.2665,37.0424;35.2667,37.0422;35.2669,37.042;35.2671,37.0419;35.2673,37.0417;35.2674,37.0415;35.2674,37.0412;35.2672,37.0408;35.267,37.04;35.2667,37.0396;35.2665,37.0391;35.2663,37.0388;35.2662,37.0384;35.266,37.0381;35.2659,37.0379;35.2658,37.0377;35.2657,37.0404;35.2668,37.0377;35.2656,37.0378;35.2652,37.0378;35.2652,37.0381;35.2646,37.0382;35.264,37.0381;35.2635,37.038;35.263,37.0379;35.2627,37.0378;35.2626,37.0376;35.2626,37.0372;35.2627,37.0367;35.2628,37.0363;35.2628,37.036;35.2629,37.0357;35.2629,37.0356;35.2628,37.0356;35.2628,37.0355;35.2626";

Cliente de servicio Web código:

Map<String, String> vars = new HashMap<String, String>();
vars.put("pointList", pointList);

String apiUrl = "http://api.website.com/service/getLocationInformations/{pointList}";

RestTemplate restTemplate = new RestTemplate();
LocationInfoObject result = restTemplate.getForObject(apiUrl, LocationInfoObject.class, vars);

Cuando ejecuto el lado cliente de la aplicación, se produce un HttpClientErrorException: 400 Bad Request, creo larga cadena de información de ubicación de las causas a este problema. Así que, ¿cómo puedo solucionar este problema? O es posible publicar largo de la cadena de valor como parámetro para el servicio web?

Thx a todos

InformationsquelleAutor vtokmak | 2014-03-19

2 Comentarios

  1. 6

    Lista o otro tipo de objetos que se pueden publicar con RestTemplate del postForObject método. Mi solución es como a continuación:

    controlador:

    @RequestMapping(value="/getLocationInformations", method=RequestMethod.POST)
    @ResponseBody
    public LocationInfoObject getLocationInformations(@RequestBody RequestObject requestObject)
    {
        //code block
    }

    Crear un objeto de solicitud para su publicación al servicio:

    public class RequestObject implements Serializable
    {
        public List<Point> pointList    = null;
    }
    
    public class Point 
    {
        public Float latitude = null;
        public Float longitude = null;
    }

    Crear un objeto de respuesta para obtener los valores de servicio:

    public class ResponseObject implements Serializable
    {
        public Boolean success                  = false;
        public Integer statusCode               = null;
        public String status                    = null;
        public LocationInfoObject locationInfo  = null;
    }

    Post lista de puntos con objeto de solicitud y obtener la respuesta de objeto de servicio:

    String apiUrl = "http://api.website.com/service/getLocationInformations";
    RequestObject requestObject = new RequestObject();
    //create pointList and add to requestObject
    requestObject.setPointList(pointList);
    
    RestTemplate restTemplate = new RestTemplate();
    ResponseObject response = restTemplate.postForObject(apiUrl, requestObject, ResponseObject.class);
    
    //response.getSuccess(), response.getStatusCode(), response.getStatus(), response.getLocationInfo() can be used
  2. 0

    En primer lugar, usted ha pasado un mapa como parámetros, pero el controlador espera que estas como una variable path. Todo lo que necesitas hacer es hacer el ‘pointlist el valor de la parte de la URL (sin la llave marcadores de posición). por ejemplo:-

    http://api.website.com/service/getLocationInformations/pointList

    Siguiente que usted necesita para asegurarse de que tiene el mensaje de convertidores configurado de forma que sus LocationInfoObject se presentaba en una representación apropiada (se sugiere JSON) y unmarshalled de la misma manera.

    Para el Resto de la plantilla:

    restTemplate.setMessageConverters(...Google MappingJackson2HttpMessageConverter...);

    Para el servidor sólo tiene que añadir Jackson a la ruta de clases (si desea múltiples representaciones que había necesidad de configurar cada uno de forma manual – Google será tu amigo aquí también.

Dejar respuesta

Please enter your comment!
Please enter your name here