2
 @RequestMapping(value = "/Foo/{id}/{friendlyUrl:.*}", method = RequestMethod.GET)
 public ModelAndView getFoo(@PathVariable final Long id, @PathVariable final String friendlyUrl) {

したがって、IDおよび任意の文字列と一致します。しかし、私はユーザーに私が指定した文字列を見てもらいたいです。

foo = fooService.get(id); //use id from pathvariable
redirectView = new RedirectView(foo.getCorrectUrl()); //set url to correct url, not that in path
redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY); //moved permanently
modelAndView = new ModelAndView(redirectView);
modelAndView.setViewName("myFoo.jsp");
return modelAndView;

ユーザーに表示されるURLが正しくないことを除いて、すべてが正常に機能します。

これは、stackoverflowサイトの既存の質問で質問のタイトルが変更された場合と同じ機能です(想定されています)。

編集、今ではほとんど機能する以下を実行します

  return new ModelAndView("redirect:/Foo/"+id+"/"+foo.getUrl());

しかし、それは一時的に移動されたステータスコードを返します、私は永続的な301が欲しいです。

spring-mvcコントローラーを使用して、書き換えられたURLと永続的に移動されたステータスコードの両方を取得する方法はありますか?

4

1 に答える 1

4

あなたのコードにはあなたが持っています

foo = fooService.get(id); //use id from pathvariable
redirectView = new RedirectView(foo.getCorrectUrl()); //set url to correct url, not that in path
redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY); //moved permanently
modelAndView = new ModelAndView(redirectView);
modelAndView.setViewName("myFoo.jsp");
return modelAndView;

の呼び出しmodelAndView.setViewName("myFoo.jsp");は、ModelAndViewコンストラクターに渡されたView(redirectView参照)の値を効果的に置き換えます。したがって、この場合はsetViewNameを呼び出さないでください。

于 2012-12-30T11:18:06.587 に答える