2016-05-10 17 views
0

Ich bekomme 400 Http Antwort, wenn ich das ungültige Json-Format,
übergeben möchte Ich möchte die benutzerdefinierte JSON-Nachricht anstelle dieser, kann jemand beraten, wie im Frühjahr zu tun 4.1?Wie 400 Fehler im Frühjahr behandelt MVC

Handling Exception mit ControllerAdvice, aber es funktioniert nicht.

@ControllerAdvice 
public class GlobalControllerExceptionHandler { 

     @ExceptionHandler({org.springframework.http.converter.HttpMessageNotReadableException.class}) 
     @ResponseStatus(HttpStatus.BAD_REQUEST) 
      @ResponseBody 
     public String resolveException() { 
     return "error"; 
     } 

} 

feder config.xml unterhalb

<bean 
     class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
     <property name="order" value="1" /> 
     <property name="mediaTypes"> 
      <map> 
       <entry key="json" value="application/json" /> 
      </map> 
     </property> 
     <property name="defaultViews"> 
      <list> 
       <!-- Renders JSON View --> 
       <bean 
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
      </list> 
     </property> 
    </bean> 

unten Json Anforderungs- und Antwort von WebSphere Application-Server (7.0) gegeben gegeben.

Request 1: Empty json request : {} 
Response Status Code: 400 Bad Request 
Response Message : Json request contains invalid data:null 


Request 2:Invalid format of Json Request : {"data":,"name":"java"} 
Response Status Code: 400 Bad Request 
Response or Exception message  : 

nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (',' (code 44)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
at [Source: [email protected]; line: 5, column: 57] 

ähnliche Frage wie unten Link Using Spring MVC, accepting POST requests with bad JSON leads to a default 400 error code server page being returned

+0

Was ist das Problem bei der Verwendung von '@ ControllerAdvice'? –

+0

@ControllerAdvice nicht ausgelöst. –

+0

1. Werden die Pakete nach Anmerkungen durchsucht? 2. Wird diese Ausnahme ausgelöst? – sergiu

Antwort

1

Schließlich habe ich die Ausnahme über Servlet Filter mit HttpServletRequestWrapper behandeln.

Schritt 1: Hinzufügen der Filter
Schritt 2: Die Anfrage Körper aus der Klasse
Schritt 3 Anpassen HttpServletRequestWrapper Erhalten: request Körper json Zeichenfolge zu Java-Objekt mit JSON API
Schritt 4 Konvertieren: Kette die Anfrage/Antwort
Schritt 5: Catch exception/und aktualisieren Sie die HttpServlet Antwort

Verwendung der folgenden Referenz.

Filter Example

HttpServletRequestWrapper Example

String to Json Object

Mit Hilfe dieses Ansatzes i 400/405/415 Http Fehler umgehen kann.

1

Sie können versuchen, die Ausnahme auf diese Weise abzuzubilden. Dieser Code wird über einen 400-Status zurück, aber Sie können die Rückkehr auf die gleiche Weise ändern, wie der Link gepostet Sie

@ExceptionHandler 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
public void handleJsonMappingException(JsonMappingException ex) {} 
+1

Ich habe es versucht, aber es funktioniert nicht. Ich bekomme die selbe Ausnahme. –

+0

Haben Sie diesen Weg versucht? –

+1

Ja, ich habe diesen Ansatz versucht, die gleiche Ausnahme zu bekommen. –

0

du versuchen können, in Ihrem pom.xml hinzufügen Abhängigkeit:

<!-- Need this for json to/from object --> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.6.3</version> 
    </dependency> 

    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.6.3</version> 
    </dependency> 

Dadurch werden Ihre Java-Objekte automatisch in JSON konvertiert, wenn Sie sie zurückgeben. wie können Sie eine Klasse für Antwort schreiben:

public class Response { 
private int responseCode; 
private String responseMessage; 
//as many fields as you like 
public Response (int responseCode, String responseMessage) { 
    this.responseCode = responseCode; 
    this.responseMessage = responseMessage; 
} } 

dann können Sie alle Java-Objekte zurück, und sie werden als JSON empfangen werden,

@RequestMapping(value="/someMethod", method=RequestMethod.POST) 
public @ResponseBody Response someMethod(@RequestBody Parameters param) { 

    return new Response(404, "your error message"); 
} 
+0

Jars Eintrag bereits in Pom-Datei verfügbar.Ich verlor die Kontrolle, sobald ich ungültige Format von JSON senden. –

Verwandte Themen