0

In meiner Ruhe Client Validierung:
Frühling ruhen mvc jackson i die Daten unter JSON Anfrage bin nicht vorbei Dateneingabe json richtig

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

So ist die extra "junkdata; @ #% $ @ #%" nicht bekam validiert durch den Rest-Client oder durch den Out-of-the-Box-Nachrichtenkonverter von Spring Jackson.
Ich habe den Code debuggen, der Frühling HttpServletRequest Körper hat die vollständigen Daten einschließlich der Junk-Daten. Da es nicht fehlschlägt, ignoriert die Quelle die Junk-Daten und konvertiert die Start-JSON-Daten in ein Java-Objekt.
Ich habe versucht, Annotationen wie @JsonFormat für @RequestBody in Ruhe Controller-Aufrufe (@RestController) hinzufügen. Aber es ist nicht validieren scheint der Spring Out-of-the-Box-Nachrichtenkonverter jackson nicht die eingehende Anfrage JSON-Daten ordnungsgemäß zu validieren.

+0

So ist die 'junkdata' außerhalb des eigentlichen JSON-Objekt ist. Recht?. Welchen Client verwenden Sie, um diese Daten an den Server zu senden? –

+0

Ja, die Junkdaten befinden sich außerhalb des eigentlichen JSON-Objekts. Ich benutze Mozilla FireFox, ich habe sogar auch Chrome ausprobiert. – Chandra

+0

Können Sie die Restcontroller-Implementierung und den Clientcode teilen, der die Anfrage sendet? Auch der JSON ist ungültig. Sie können die JSON-Gültigkeit für [JSONLint] (https://jsonlint.com/) prüfen. –

Antwort

0

Nachdem ich auf verschiedenen Wegen gearbeitet habe, habe ich die Lösung, @Pete ja Ich habe die JSON-Eingabe validiert, die ungültig ist. Die Google Gson API überprüft es ordnungsgemäß, wir müssen den benutzerdefinierten Nachrichtenkonverter verwenden, um es in der restlichen WebMvcConfigurationSupport-Klasse zu überprüfen.

@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()); 
       } 
      }); 
     } 

} 

Aber die seltsame Sache, die ich bemerkt habe ist, dass seine Arbeit nur dann, wenn ich es als anonyme Klasse machen, oder indem die Klasse mit in der gleichen Datei. Wenn ich diesen benutzerdefinierten Nachrichtenkonverter außerhalb dieser RestControllerConfiguration.java-Datei erstelle, wird er nicht validiert. Hier ist das Beispiel:

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

Dies wird validiert werden, und wird Fehler werfen wie

{"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"} 
Verwandte Themen