Не повторять путь дважды в Spring 3.0 MVC Restful mappings - PullRequest
2 голосов
/ 19 января 2010

Я отображаю URL /modules/tips/SOME_ID/small, чтобы получить доступ к подсказке с идентификатором SOME_ID и отобразить ее, используя представление small.jsp. Следующий код прекрасно работает для этого, однако я вынужден повторить строку modules/tips в двух местах. У Spring MVC, кажется, нет соглашения для этого, которое я могу определить. Кроме использования константы, есть ли лучший способ уменьшить это повторение?

@Controller
public class TipsController{

  @RequestMapping(value="/modules/tips/{tipId}/{viewName}",method=RequestMethod.GET)
  public ModelAndView get(
    @PathVariable String tipId,
    @PathVariable String viewName) {
    Tip tip = findTip(tipId);
    return new ModelAndView("modules/tips/" + viewName,"tip",tip);
  }
}

Ответы [ 4 ]

1 голос
/ 19 января 2010

Вы видите, что логика сопоставления имен выглядит слишком «нестандартно», поэтому Spring вряд ли сможет предложить какую-то встроенную поддержку для нее.Однако, как теоретическая возможность, вы можете реализовать пользовательский ModelAndViewResolver и зарегистрировать его в AnnotationMethodHandlerAdapter

0 голосов
/ 30 августа 2010

Если вы измените свой элемент <url-pattern> в web.xml, включив в него modules/tips, вы можете эффективно опустить его во всех настройках привязки Spring:

<servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/myapp/modules/tips/*</url-pattern>
</servlet-mapping>


@RequestMapping(value="/{tipId}/{viewName}",method=RequestMethod.GET)
public ModelAndView get(
    @PathVariable String tipId,
    @PathVariable String viewName) {
    Tip tip = findTip(tipId);
    return new ModelAndView(viewName,"tip",tip);
}
0 голосов
/ 28 августа 2010

Вы можете делать то, что пытаетесь сделать, просто опуская имя представления, если ваши представления совпадают с вашими URL.Если вы не предоставите имя представления, Spring будет использовать RequestToViewNameTranslator, чтобы попытаться выяснить имя представления.Вы можете посмотреть на источник для этого класса, чтобы увидеть, как именно он работает.Вот хорошая цитата из документов:

"... URL запроса 'http://localhost/registration.html' приведет к тому, что имя логического представления' registration 'будет сгенерировано DefaultRequestToViewNameTranslator. Это имя логического представлениябудет преобразован в представление «/WEB-INF/jsp/registration.jsp» внутренним компонентом InternalResourceViewResolver.по умолчанию "tips" будет пытаться использовать представление с именем "modules / tips", вероятно, у вас будет JSP по адресу "/WEB-INF/jsp/modules/tips.jsp".

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-coc-r2vnt

РЕДАКТИРОВАТЬ: Я только что заметил, что вы сказали, что пытались опустить имя представления, и, похоже, это не сработало.Вы всегда можете написать свою собственную реализацию RequestToViewNameTranslator и заменить DefaultRequestToViewNameTranslator своим собственным пользовательским дополнением.Посмотрите документы, чтобы узнать, как ввести свой собственный переводчик.

0 голосов
/ 19 января 2010

Вы можете разместить аннотацию @requestMappings для вашего класса.В этом случае аннотации @requestMapping для методов относятся к следующему:

@Controller
@RequestMapping(value="/modules/tips")
public class TipsController{

    @RequestMapping(value="{tipId}/{viewName}",method=RequestMethod.GET)
    public ModelAndView get(
        @PathVariable String tipId,
        @PathVariable String viewName) {
        Tip tip = findTip(tipId);
        return new ModelAndView("modules/tips/" + viewName,"tip",tip);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...