2013-01-21 1 views
1

Я хочу сделать сопоставления запросов в моем приложении приложения Spring. Так что мой URL не может быть понятным. И я могу показать что-то бессмысленное для пользователя, и цель сохранения карты будет решена.Использование аннотации @Value со статической конечной переменной в Spring Framework

Для этого я сохраняю динамическую часть URL-адреса в файле свойств. И хотите использовать это в аннотации @RequestMapping. И то же самое будет сделано на стороне клиента в JSP. Я прочитаю значение из файла свойств и создам href.

Я использую аннотацию @Value, чтобы прочитать значения файла свойств.

Существует один класс, который содержит все такие значения в конечных статических переменных.

public class UrlMappingAbstraction { 
    public static final @Value("#{urlAbstractionProperties['url.message']?:'message'}") String MESSAGE = ""; 
} 

И я простирающийся этот класс в моем контроллере и с помощью статического окончательного поля в @RequestMapping аннотацию, как показано ниже.

@RequestMapping(value="/"+MESSAGE+"/{id}", method=RequestMethod.GET) 

А также JSP Читаю значение из файла свойств с помощью <spring:message/> и генерирующий URL в HREF.

Проблема заключается в том, что jsp может создать правильный URL-адрес на основе значения файла свойств, но в аннотации @RequestMapping мое значение не заменяется.

Может ли кто-нибудь сказать мне точную проблему? Я знаю, что мы не можем изменить значение статической конечной переменной после ее инициализации. Тогда зачем использовать аннотацию @Value.

Если это можно сделать другим способом, то вы также можете показать мне это.

Заранее спасибо.

ответ

2

Аннотации статичны по своей природе, поэтому вы не можете сделать это таким образом.

@Value не может быть использован для полей static, но здесь это неважно. Реальная проблема заключается в том, что нельзя использовать значения, отличные от констант времени компиляции, в качестве атрибутов аннотаций.

Вы можете использовать один из следующих вариантов:

  • Добавить URL переписывания фильтр (например, this или this) и настроить его для выполнения необходимого преобразования.

    Этот подход выглядит более элегантным из-за четкого разделения обязанностей - диспетчеры несут ответственность за выполнение своих задач, переписывающий фильтр отвечает за обфускацию URL-адресов.

  • создание Intercept отображений контроллера путем переопределения RequestMappingHandlerMapping. getMappingForMethod() и изменить свои модели URL на этом этапе (не тестировалось)

+0

Второй вариант выглядит более перспективным для меня, поскольку это будет более сложным. :-D Я не хочу идти с первым вариантом, потому что я уже понял это, прежде чем задавать этот вопрос. И я обнаружил, что для моего уже перегруженного проекта потребуется дополнительная конфигурация плюс накладные расходы дополнительной зависимости. Спасибо за помощь. Как только я вернусь в свой офис, я проверю это и вернусь к вам. :) –

0

Я дополнит предложения @ axtavt, говоря, вы просто должны делать это в обратном направлении. Вам действительно нужно настроить время выполнения URL-адреса сообщения?

Если вы не чем просто сделать статическую переменную так же, как вы есть, но с вне @Value:

public final class UrlMapping { 
    public static final String MESSAGE = "message"; 
} 

Тогда в вашем JSP относятся к UrlMapping.MESSAGE вместо файла свойств.

Несмотря на то, что его не так гибко его гораздо проще и имхо, его плохая идея сделать URL-адреса конечной точки слишком настраиваемыми, потому что неизбежно вы будете жестко указывать что-либо либо в Javascript, либо в шаблоне. Также изменение URL-адресов плохо для SEO.

+0

Цель моего веб-приложения не для SEO. Его первоочередной задачей является безопасность. Вот почему я хочу пойти с чем-то подобным. Я уже понял ваш вариант, но по этой опции мне нужно написать часть «UrlMapping.MESSAGE» в JSP, используя скриптлет. И это очень плохо, чтобы писать скрипты в jsp. IE будет иногда ударять вас, если он обнаружит это. : D Но спасибо за ваше время и помощь. :) –

+0

@Japs конечно это «мое мнение», но JSP и Internet Explorer оба почти одинаково злые :). Я предпочитаю Handlebars.java, Freemarker или Scalate. Но если JSP плавают на вашей лодке ... –

+0

Да, вы правы. :) –

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

  • Нет связанных вопросов^_^