0

@ModelAttribute有一些网址需要添加@PathVariable/{city}/**

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

现在我制作它并为所有人@ControllerAdvise添加@ModelAttribute@RequestMapping

但是有些网址不包含{city}类似的路径/

并且当 request 时/,Spring 抛出一个 Exception 表明{city}路径中没有

可以@ControllerAdvise排除建议一些像“/”这样的网址,或者有没有其他方法@ControllerAdvise 可以实现它?我试过HandlerInterceptor了,但不容易解决

编辑:由于我的大多数网址都喜欢 /{city}/**,并且在大多数@RequestMapping情况下,{city}变量不需要传递给服务,我只是对其进行转换并将其传递给视图。我不想看到我的大多数@RequestMapping方法都带有City参数,而只是将其添加到Modeland@Controller中。这是非常丑陋的。

所以@Bhashit Parikh 的帖子可能比@Ralph 更符合我的要求,我稍后会对其进行测试。先谢谢大家了!

4

2 回答 2

3

使用 aConverter<String, City>将您的 City-String 转换为 City-Object。

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);
   }
}

我希望这能回答您的问题,如果没有,请尝试改写您的问题以指出您的问题。

于 2013-05-22T08:27:04.613 回答
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);
}
于 2013-05-22T12:18:48.077 回答