2013-07-08 1 views
3

Я строй приложения REST, который работает на Glassfish 3, и возникает проблемы обработки случая, когда параметр, связанные с перечислением:JAX-RS джерси: Исключение Mapping для Enum связан FormParam

@FormParam("state") final State state 

Итак, State - это просто перечисление, которое содержит разные типы состояний.

В случае отправки значения, которое невозможно разобрать, возвращается http 400. Это в принципе нормально. Однако мне нужно перехватить это исключение и вернуть пользовательский ответ, который предоставляет дополнительную информацию клиенту. (например, json-объект, содержащий описание: «state invalid»). Я привязал параметры к своим собственным классам и смог правильно обработать обработку исключений, но я не смог найти никакой информации о том, как обращаться с этим случаем при использовании перечисления. Думаю, я тоже могу использовать выделенный класс для этого, но я хотел бы избежать этого, если можно сохранить перечисление.

ответ

4

Способ, которым я обращался с этим было первым иметь подходящий десериализатор в моем перечислении:

@JsonCreator 
public static Type fromString(final String state) 
{ 
    checkNotNull(state, "State is required"); 
    try 
    { 
    // You might need to change this depending on your enum instances 
    return valueOf(state.toUpperCase(Locale.ENGLISH)); 
    } 
    catch (IllegalArgumentException iae) 
    { 
    // N.B. we don't pass the iae as the cause of this exception because 
    // this happens during invocation, and in that case the enum handler 
    // will report the root cause exception rather than the one we throw. 
    throw new MyException("A state supplied is invalid"); 
    } 
} 

А потом написать картограф исключения, которое позволит вам поймать это исключение и возвращаете подходящий ответ:

@Provider 
public class MyExceptionMapper implements ExceptionMapper<MyException> 
{ 
    @Override 
    public Response toResponse(final MyException exception) 
    { 
    return Response.status(exception.getResponse().getStatus()) 
        .entity("") 
        .type(MediaType.APPLICATION_JSON) 
        .build(); 
    } 
} 
+1

спасибо. Я не знал, что перечисление также анализируется с помощью функции fromString(). Документация немного расплывчата. Я на самом деле никогда не пробовал этого, потому что это казалось странным. –

0

Подсказка: необходимо, чтобы MyException расширяет исключение WebApplicationException. Другие исключения (например, исключение IllegalArgumentException) не обрабатываются ни одним провайдером в этой области (при анализе запроса).