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"}
So ist die 'junkdata' außerhalb des eigentlichen JSON-Objekt ist. Recht?. Welchen Client verwenden Sie, um diese Daten an den Server zu senden? –
Ja, die Junkdaten befinden sich außerhalb des eigentlichen JSON-Objekts. Ich benutze Mozilla FireFox, ich habe sogar auch Chrome ausprobiert. – Chandra
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. –