2014-12-17 2 views
1

Мы используем Джерси 1.13. Не мой выбор, но пока мы не можем обновить до более высокой версии.Как получить заголовки http в пользовательских классах параметров пути?

Jersey позволяет использовать созданные пользователем типы java для использования параметров пути. Пример, приведенный в документации что-то вроде этого: метод

Ресурс:

@Path("paint/{color}") 
@GET 
public Response paint(@PathParam("color") ColorParam color) { ... } 

Пользовательский тип Java для параметра пути {цвета}

public class ColorParam { 
    public ColorParam(String s) { 
     try { 
      ... // implementation here 
     } catch (Exception e) { 
      throw new WebApplicationException("Something's wrong"); 
     } 
    } 
} 

мне нужно локализовать My строка ошибки ответа - «Что-то не так». Для этого мне нужна информация заголовка «Accept-Language». Есть ли способ получить его внутри моего класса ColorParam?

Если бы это был класс ресурсов, я мог бы использовать инъекцию «@Context HttpHeaders requestHeaders». Может ли что-то подобное быть достигнуто в моем обычном классе?

ответ

1

Вот решение, которое я придумал:
Мой пользовательский класс ColorParam бросает специальное исключение, скажем InvalidColorException extends WebApplicationException. Вся информация, необходимая для создания ответа, кроме Locale, сохраняется в этом настраиваемом исключении (например, сообщение о нелокализованной ошибке, код ответа HTTP и т. Д.). Я также создал картограф исключения для отображения InvalidColorException до желаемого ответа, который выполняет локализацию, как это имеет доступ к заголовкам запросов, а именно «Accept-Language» заголовка:
public class InvalidColorExceptionMapper implements ExceptionMapper

Таким образом, создание ColorParam является полностью прозрачным для все классы ресурсов (предположим, что они используются в довольно многих).

0

Я не думаю, что класс параметров запроса является правильным местом для локализации ответа. Этот класс создает экземпляр параметра из запроса, он не создает ответ.

Проверьте color экземпляр в paint и выбросьте WebApplicationException. Там вы можете использовать все заголовки.

+0

Да, пользовательский класс 'ColorParam' не должен создавать ответ, но я не вижу проблем, если он делегирует какой-то вспомогательный класс, который знает, как это сделать, поэтому« ColorParam »затем просто бросает« WebApplicationException (Response response) » , Проблема в том, что для вспомогательного класса необходимо знать запрос Locale для создания правильного ответа. И я не хочу, чтобы «PaintResource» (предположим, что это имя класса ресурсов выше), чтобы создать ответ, потому что я хочу, чтобы этот процесс был прозрачным для классов ресурсов. –

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