0

내 나머지 클라이언트에서 내가 JSON 요청 데이터 아래를 통과하고 입력 JSON 데이터를 검증 할 수 없습니다 휴식 휴식 클라이언트 또는 봄 jackson out-of-the-box 메시지 변환기에 의해 유효성이 검사됩니다.
코드를 디버깅했는데 스프링 HttpServletRequest 본문에는 정크 데이터를 포함한 전체 데이터가 있습니다. 그러한 오류가 발생하지 않았으므로 스프링은 정크 데이터를 무시하고 시작 JSON 데이터를 Java 객체로 변환합니다.
나머지 컨트롤러 호출 (@RestController)에서 @RequestBody에 대한 @JsonFormat과 같은 특수 효과를 추가하여 시도했습니다. 그러나 유효성 검사를하지 않으면 Spring의 out-of-the-box 메시지 변환기 인 jackson이 들어오는 요청 JSON 데이터의 유효성을 제대로 검사하지 못하는 것으로 보입니다.스프링 MVC 잭슨이 제대로

+0

같은 오류가 발생합니다 : 다음은 예입니다. 권리?. 이 데이터를 서버로 보내는 데 사용하는 클라이언트는 무엇입니까? –

+0

예 junkdata가 실제 JSON 개체 외부에 있습니다. Mozilla FireFox를 사용하고 있습니다. Chrome을 사용해 보았습니다. – Chandra

+0

요청을 보내는 클라이언트 코드와 나머지 컨트롤러 구현을 공유 할 수 있습니까? 또한 JSON이 유효하지 않습니다. [JSONLint] (https://jsonlint.com/)에서 JSON 유효성을 확인할 수 있습니다. –

답변

0

다른 방법으로 작업 한 후 @Pete 예, 유효하지 않은 JSON 입력의 유효성을 검사했습니다. Google gson API가 올바르게 유효성을 검사하고 있으므로 사용자 지정 메시지 변환기를 사용하여 나머지 WebMvcConfigurationSupport 클래스에서 유효성을 검사해야합니다.

@Configuration 
@ComponentScan(basePackages = { "com.teradata.datamovement.rest.controllers", 
     "com.teradata.rest.controller" }) 
public class RestControllerConfiguration extends WebMvcConfigurationSupport 
{ 
     @Override 
     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
      log.debug("Adding custom message converter."); 
      converters.add(new AbstractHttpMessageConverter<Object>(MediaType.APPLICATION_JSON, new MediaType("application", "*+json")){ 
       @Override 
       protected Object readInternal(Class<? extends Object> clazz, 
               HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
        try{ 
         log.debug("Converting and validating the http request body data."); 
         String httpRequestBody = convertStreamToString(inputMessage.getBody()); 
         log.debug("Http request body data:"+httpRequestBody); 
         return new Gson().fromJson(httpRequestBody, clazz); 
        } 
        catch(JsonSyntaxException e){ 
         throw new HttpMessageNotReadableException("Invalid input JSON data: " + e.getMessage(), e); 
        } 
       } 
       private String convertStreamToString(InputStream is) throws IOException { 
        if (is != null) { 
         Writer writer = new StringWriter(); 
         char[] buffer = new char[1024]; 
         try { 
          Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
          int n; 
          while ((n = reader.read(buffer)) != -1) { 
           writer.write(buffer, 0, n); 
          } 
         } finally { 
          is.close(); 
         } 
         return writer.toString(); 
        } else { 
         return ""; 
        } 
       } 
       @Override 
       protected boolean supports(Class clazz) { 
        return true; 
       } 
       @Override 
       protected void writeInternal(Object t, HttpOutputMessage outputMessage) 
         throws IOException, HttpMessageNotWritableException { 
        outputMessage.getBody().write(new Gson().toJson(t).getBytes()); 
       } 
      }); 
     } 

} 

그러나 내가 발견 한 이상한 것은 그 난 익명 클래스로 또는 동일한 파일에 클래스를 추가하여 만들 경우에만 작동한다는 것입니다. 이 RestControllerConfiguration.java 파일 밖에서이 사용자 지정 메시지 변환기를 만든 다음 유효성을 검사하지 않습니다. 그래서`junkdata` 실제 JSON 개체 밖에

{ 
"jobName":"test1", 
"source":{ "name":"prod1","type":"teradata"}, 
"target":{ "name":"prod2","type":"teradata"}, 
"objects":{ "name":"table1"} 
} 
junkdata ; @#%[email protected]#% 

이 검증받을 것이며,

{"message":"Invalid input JSON data: com.google.gson.stream.MalformedJsonException: Expected EOF at line 7 column 1; nested exception is com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected EOF at line 7 column 1"}