@ControllerAdvise可以排除或包含一些网址吗?

时间:2013-05-22 07:49:09

标签: spring spring-mvc

我有一些网址需要添加来自@ModelAttribute的{​​{1}} @PathVariable

我需要将city值转换为bean,并在稍后的视图中使用它们;

现在我使用/{city}/**创建并为@ControllerAdvise添加@ModelAttribute

但有些网址不包含@RequestMapping

之类的{city}路径

当请求/时,Spring抛出异常表明路径中没有/

{city}可以排除建议某些网址如“/”,还是有其他方式没有@ControllerAdvise来实现它?我试过了@ControllerAdvise,但要解决它并不容易

编辑: 由于我的大部分网址都是HandlerInterceptor,而且大多数/{city}/** @RequestMapping变量都不需要传递给服务,我只需将其转换并传递给视图。我不会看到我的大多数{city}方法都带有@RequestMapping参数,只需将其添加到CityModel。这很难看。

所以@Bhashit Parikh的帖子可能比@Ralph更能满足我的要求,我稍后会测试它。先谢谢大家!

2 个答案:

答案 0 :(得分:3)

使用Converter<String, City>将您的城市字符串转换为城市对象。

public class CityConverter implements Converter<String, City> {

    @Override
    public City convert(final String bidString) {
        return ....
    }
}

FormattingConversionServiceFactoryBean

注册此转换器后
<bean id="applicationConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converter">
        <set>
             <bean class="StingCityConverter" autowire="byType" />
        </set>
    </property>
</bean>

您可以在每个地方使用它,例如:

@RequestMapping("city/")
@Controller
public class Controller {

   @RequestMapping(value = "/{cityId}", method = RequestMethod.GET)
   public ModelAndView show(@PathVariable("cityId") City city) {
        ...
   }

   @RequestMapping(value = "/", method = RequestMethod.GET)
   public ModelAndView show() {           
        /* depends on what you want to do */
        return this.show(null);
   }
}

我希望这能回答您的问题,如果没有,请尝试重新提问您的问题,以便指明您的问题。

答案 1 :(得分:0)

我猜你正在使用@ModelAttribute方法,如下所示:

@ModelAttribute("cityBean")
public City city(@PathVariable String city) {
    return cityService.findByName(city);
}

您可以做的是,按以下方式更新上述方法:

@ModelAttribute("cityBean")
public City city(HttpServletRequest request) {
    Map<String, String> pathVars = (Map<String, String>)request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
    if(pathVars == null || !pathVars.contains("city")) {
        // The path variable not present, do whatever you need here.
        return null;
    }
    return cityService.findByName(city);
}