2015-02-19 3 views
0

Я работаю над проектом Android, в котором я хочу создать соединение RESTful POST с сервером на основе Spring-MVC. Сначала я попытался опубликовать объект, но я использовал ошибки. Вот почему я попытался отправить объект JSON. В настоящее время я не получаю никаких ошибок в приложении Android, но когда я получаю объект JSON и получаю String, в объекте JSON ничего нет. Я отлаживал код, чтобы видеть, что значения отправляются правильно. Я не знаю, что я делаю неправильно. Любая помощь будет приятной. Большое спасибо.Spring-MVC & Android: сервер получает пустую строку JSON от android

Android код для отправки объекта:

@Override 
    public void addRestaurant(Restaurant restaurant) { 
     Log.d("Restaurant Name",restaurant.getRestaurantName()); 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 

        Looper.prepare(); 
        HttpClient client = new DefaultHttpClient(); 
        HttpConnectionParams.setConnectionTimeout(client.getParams(),10000); 
        HttpResponse response; 
        JSONObject jsonObject = new JSONObject(); 

        HttpPost post = new HttpPost(url); 
        jsonObject.put("restaurantName",restaurant.getRestaurantName()); 
        jsonObject.put("postLeitZahl",restaurant.getPostLeitZahl()); 
        jsonObject.put("phoneNumber",restaurant.getPhoneNumber()); 
        jsonObject.put("id",restaurant.getId()); 

        StringEntity stringEntity = new StringEntity(jsonObject.toString()); 
        stringEntity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,"application/JSON")); 
        post.setEntity(stringEntity); 
        response = client.execute(post); 

       } catch (Exception e){ 
        e.printStackTrace(); 
       } 
       Looper.loop(); 
       //String response = restTemplate.postForObject(url,restaurant,String.class); 
       //Log.d(response,"Response from webserver is"); 
      } 
     }); 
     thread.setPriority(Process.THREAD_PRIORITY_BACKGROUND); 
     thread.start(); 
    } 
} 

Spring Controller Код:

@RequestMapping(value = "/restaurant/add",method = RequestMethod.POST,consumes="application/json") 
    @ResponseBody 
    public String addRestaurantWebView(JsonObject restaurant){ 
     System.out.println(restaurant.getAsString()); 
     return "true"; 
    } 

Я не знаю, что я делаю не так, и у меня возникли проблемы с поиском некоторые ресурсы, которые могут сказать мне как настроить сервер в соответствии с кодом в android или наоборот. Большое спасибо .. :-)

Edit (Solution) (Partial с Java Objects)

В моей первоначальной цели была отправить объект Java, который был неисправным, я вернулся к JSON, но позже его работал с Java, вот код Android и Spring-MVC Controller и bean, который работал для меня.

Android код:

package com.example.myapp; 

import android.os.Process; 
import android.util.Log; 
import org.springframework.http.*; 
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; 
import org.springframework.web.client.RestTemplate; 

public class RestaurantServiceImpl implements RestaurantService { 

    String url = "http://192.168.178.40:8080/restaurant/add"; 

    @Override 
    public void addRestaurant(Restaurant restaurant) { 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        RestTemplate restTemplate = new RestTemplate(); 
        restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
        HttpHeaders headers = new HttpHeaders(); 
        headers.setContentType(MediaType.APPLICATION_JSON); 
        HttpEntity entity = new HttpEntity(restaurant,headers); 
        ResponseEntity<String> out = restTemplate.exchange(url, HttpMethod.POST,entity,String.class); 
        Log.d(out.toString(),"Response from server"); 
       } catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     }); 
     thread.setPriority(Process.THREAD_PRIORITY_BACKGROUND); 
     thread.start(); 
    } 
} 

Spring MVC-контроллер:

@RequestMapping(value = "/restaurant/add",method = RequestMethod.POST) 
    @ResponseBody 
    public String addRestaurantWebView(@RequestBody Restaurant restaurant){ 
     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.addObject("restaurant", new Restaurant()); 
     modelAndView.addObject(restaurant); 
     this.restaurantService.addRestaurant(restaurant); 
     return "true"; 
    } 

Servlet-context.xml

Добавить это:

<mvc:annotation-driven /> 

<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     <beans:property name="messageConverters"> 
       <beans:ref bean="jsonMessageConverter"/> 
     </beans:property> 
    </beans:bean> 

    <beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
+0

Первая попытка проверить сервер, посылая POST вручную клиентский инструмент для отдыха, например, клиент Advanced Rest или Postman. Таким образом, вы будете уверены, что сервер работает нормально. – hmartinezd

+0

@hmartinezd: Сделал это. Я получаю неподдерживаемый тип запроса 415. Я предполагаю, что я должен изменить код сервера. Вы знаете, как должен быть Контроллер? –

+0

Вы настраиваете в Rest Client для отправки Json? Слушает ли ваша сторона на стороне Json? У меня нет опыта в том, что вы используете на сервере. Не могу сказать точно. – hmartinezd

ответ

1

Это, как я бы do: создать класс Ресторан на вас весна приложение. Затем используйте его в качестве параметра в отображении запроса с @ModelAttribute:

public String addRestaurantWebView(@ModelAttribute Restaurant restaurant) { 

Затем на Android отправить параметры с MultipartEntity:

Charset charset = Charset.forName("UTF-8"); 
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null, charset); 
entity.addPart("restaurantName", new StringBody(restaurant.getRestaurantName(), charset)); 
entity.addPart("postLeitZahl", new StringBody(restaurant.getPostLeitZahl(), charset)); 
entity.addPart("phoneNumber", new StringBody(restaurant.getPhoneNumber(), charset)); 
entity.addPart("id", new StringBody(restaurant.getId(), charset)); 

HttpPost post = new HttpPost(url); 
post.setEntity(entity); 
response = client.execute(post); 
+0

Спасибо за ответ, все тот же .. Null Strings. –

+0

Я отредактировал свой вопрос –

+0

Спасибо за ваш ответ. Что-то не так, я загрузил Jar для org.apache.http.entity.mime, у которого есть MultiPartEntity, но для второго атрибута, такого как restaurant.getRestaurantName(), сказано, что ожидается org.apache.http.entity.mine.content.ContentBody, найденный String. Кроме того, кодировка не определена. Не могли бы вы объяснить, что мне делать с этими переменными? –

Смежные вопросы