2014-09-06 31 views
0

我是Spring MVC REST的新手。我花了數小時搜索並嘗試不同的方法來解決這個問題。 這段代碼爲什麼不用雙引號產生JSON?postForEntity不會產生正確的JSON表示...在我的智慧結尾

  List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();    
     MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter = new MappingJackson2HttpMessageConverter(); 
     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
     objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
     mappingJacksonHttpMessageConverter.setObjectMapper(objectMapper); 
     mappingJacksonHttpMessageConverter.setPrettyPrint(true);      
     converters.add(mappingJacksonHttpMessageConverter);    
     template.setMessageConverters(converters); 

     ResponseEntity<EAApplication> response = template.postForEntity(
      LOCAL_URI, 
      requestEntity, EAApplication.class); 

產生下面的JSON沒有雙引號,所以服務器發送400錯誤的請求。

{ applications: 
[ { submissionDate: '2014-09-05T08:28:17', 
    firstName: 'Mickey', 
    lastName: 'Mouse', 
    email: '[email protected]', 
    dietaryRestrictions: 'Cheese only', 
    restSkillLevel: 'Novice', 
    jsonSchemaSkillLevel: 'Expert', 
    restStandardFamiliarity: true, 
    slimFamiliarity: true, 
    odataLibFamiliarity: true } ] } 
+0

我們可以看到你的'requestEntity'嗎? – 2014-09-06 17:24:30

回答

0

你的客戶端代碼工作得很好。 400錯誤請求可能是由於您的控制器端可能無法處理內容的錯誤。

上面粘貼的JSON沒有雙引號,因爲有些編輯器或程序爲了提高可讀性而渲染JSON。通過postForEntity序列化後的原始字符串實際上是使用雙引號生成JSON。

下面提到的代碼正在工作,我通過編寫測試來測試它。

package com.test.rest.controller; 

import com.fasterxml.jackson.annotation.JsonInclude; 
import ........  

public class TestAppController { 

@Test 
public void testController() throws Exception { 

    Server mockServer = new Server(9190); 
    startMockServer("query-rs-main.xml", "query-rs", mockServer); 

    EAApplication requestEntity = new EAApplication(); 
    Application application = new Application(); 
    application.setDietaryRestrictions("Cheese only"); 
    application.setFirstName("Mickey"); 
    application.setLastName("Mouse"); 
    application.setEmail("[email protected]"); 
    application.setJsonSchemaSkillLevel("Expert"); 
    application.setRestSkillLevel("Novice"); 
    application.setSubmissionDate(new Date()); 
    application.setOdataLibFamiliarity(true); 
    application.setRestStandardFamiliarity(true); 

    List<Application> list = new ArrayList<>(); 
    list.add(application); 

    requestEntity.setApplications(list); 

    RestTemplate template = new RestTemplate(); 

    List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); 
    MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter = new MappingJackson2HttpMessageConverter(); 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
    objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
    mappingJacksonHttpMessageConverter.setObjectMapper(objectMapper); 
    mappingJacksonHttpMessageConverter.setPrettyPrint(true); 
    converters.add(mappingJacksonHttpMessageConverter); 
    template.setMessageConverters(converters); 

    ResponseEntity<EAApplication> response = template.postForEntity(
      "http://localhost:9190/query-rs/eaapps", 
      requestEntity, EAApplication.class); 

    mockServer.stop(); 

} 

public static void startMockServer(final String mainAppContextConfig, final String contextRoot, Server server) throws Exception { 
    final DispatcherServlet servlet = new DispatcherServlet(); 
    servlet.setContextConfigLocation("classpath:" + mainAppContextConfig); 
    final ServletHolder servletHolder = new ServletHolder(servlet); 

    final ServletContextHandler context = new ServletContextHandler(); 
    context.setErrorHandler(null); 
    context.setContextPath("/" + contextRoot); 
    context.addServlet(servletHolder, "/*"); 

    server.setHandler(context); 
    server.start(); 
} 


} 

控制器在服務器端 -

package com.yt.nss.rest.query.mock.controller; 


import org.springframework.http.HttpStatus; 
import .... 

@Controller 
@RequestMapping("/eaapps") 
public class EAApplicationsController { 


@RequestMapping(method = RequestMethod.POST) 
public ResponseEntity<Object> submitMessage(final @RequestBody EAApplication eaApplication) { 

    System.out.println(eaApplication); 
    return new ResponseEntity<Object>(null, HttpStatus.OK); 
} 

}用於傳遞JSON

@XmlRootElement 
public class EAApplication { 
private List<Application> applications; 

public List<Application> getApplications() { 
    return applications; 
} 

public void setApplications(List<Application> applications) { 
    this.applications = applications; 
} 

@Override 
public String toString() { 
    return "EAApplication{" + 
      "applications=" + applications + 
      '}'; 
} 
} 

當我運行在客戶端和服務器

EAApplication類或POJO中,調用已成功完成控制器,並且控制器方法上的EAApplication對象完全爲p opulated。

我建議你看看你的控制器和彈簧mvc配置在服務器端或張貼在這裏。

+0

你是說你的模擬服務器也收到JSON而沒有引用字段名稱,就像我的一樣嗎?模擬服務器能夠正確解析它嗎?你說:「通過postForEntity序列化後的原始字符串實際上是用雙引號生成JSON。」 - 我在代碼中沒有看到。不幸的是,我沒有訪問服務器端代碼。 – solvetech 2014-09-07 15:08:55

+0

是的。 Mock服務器能夠使用客戶端發送的所有值將JSON解析回對象中。 – 2014-09-07 16:59:19

+0

您可以通過查看輸出來確認它,在配置中打開「漂亮打印」後,字節數組看起來像這樣。 [123,13,10,32,32,34,97,112,112,108,...]這裏的第五個元素是34(雙引號),後面是'應用程序'。您可以在com.fasterxml.jackson.databind.ser.BeanSerializer.serialize方法中放置斷點並檢查變量jgen._outputBuffer。您也可以使用tcpdump來查看傳出到服務器的TCP數據包。 – 2014-09-07 17:08:01

相關問題