2016-05-10 2 views
0

Я получаю ответ 400 Http, когда я передаю неверный формат json,
Я бы хотел вернуть вместо этого пользовательское json-сообщение, может ли кто-нибудь посоветовать, как это сделать весной 4.1?Как обработать ошибку 400 в Spring MVC

Обработка Execption с использованием ControllerAdvice, но она не работает.

@ControllerAdvice 
public class GlobalControllerExceptionHandler { 

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

} 

пружинно-config.xml приведено ниже

<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> 

, приведенные ниже запроса Json и ответа от сервера приложений WebSphere (7.0).

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] 

Похожий вопрос как ссылку ниже Using Spring MVC, accepting POST requests with bad JSON leads to a default 400 error code server page being returned

+0

В чем проблема при использовании '@ ControllerAdvice'? –

+0

@ControllerAdvice не запускается. –

+0

1. Сканируются ли пакеты для аннотаций? 2. Исключено ли это исключение? – sergiu

ответ

1

Наконец я имею обработать исключение через Servlet фильтр с HttpServletRequestWrapper.

Шаг 1: Добавить фильтр
Шаг 2: Получите тело запроса от Настройка HttpServletRequestWrapper класса
Шаг 3: Преобразование JSON строку запроса тела в объект Java с помощью JSON API
Шаг 4: Цепь запроса/ответа
Шаг 5: Исключение сбоя/и обновление ответа HttpServlet

Использование ниже ссылки.

Filter Example

HttpServletRequestWrapper Example

String to Json Object

С помощью этого подхода я могу справиться с 400/405/415 Ошибки HTTP.

1

Вы можете попытаться отобразить за исключением таким образом. Этот код будет возвращать 400 статус, но вы можете изменить возвращения так же, как это ссылка, которую вы размещены

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

Я пробовал, но он не работает. Я получаю то же исключение. –

+0

Вы пробовали этот путь? –

+1

Да, я пробовал этот подход, получая то же исключение. –

0

Вы можете попробовать это в вашем pom.xml добавить зависимость:

<!-- 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> 

это автоматически преобразует ваши java-объекты в JSON при их возврате. как вы можете написать класс для ответа:

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; 
} } 

, то вы можете вернуть любые объекты Java, и они будут получены в формате JSON,

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

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

Запись Jars уже доступна в файле pom. Я потерял контроль, когда отправил неверный формат json. –

Смежные вопросы