NoHandlerFoundException集中的'参数映射'在哪里?

时间:2012-10-05 10:58:47

标签: java spring spring-mvc portlet

我正在尝试解决为什么抛出以下异常。

我认为这是因为在“查看”模式下访问了一个portlet,但由于某种原因我不知道spring servlet容器无法提供请求,这是正确的吗?

以下例外集中的'参数映射'在哪里?

  

org.springframework.web.portlet.NoHandlerFoundException:没有匹配   为portlet请求找到的handler方法:mode'view',phase   'ACTION_PHASE',参数map [empty]

这是控制器:

@Controller
@RequestMapping("VIEW")
public class DetailsController {
    @RequestMapping("VIEW")
    public String showDetails(final ModelMap modelMap, final RenderRequest renderRequest) {
        return "allDetails/details";
    }
}

2 个答案:

答案 0 :(得分:6)

以下是我可以提出的3个想法(知道你的控制器如何调用会有所帮助)。 尝试其中一种,或混合使用它们,并告诉我它是否有效。

创意1:为showDetails @RequestMapping注释删除("VIEW")

...
public class DetailsController {

    @RequestMapping
    public String showDetails(final ModelMap modelMap, final RenderRequest renderRequest) {
        return "allDetails/details";
    }

}

如果你的调用JSP有这样的东西,这可能有用:<portlet:actionURL/>:showDetails将是默认的渲染方法。

构思2:为@RequestMapping方法注释指定action参数。

...
public class DetailsController {

    @RequestMapping(params = "action=viewDetails")
    public String showDetails(final ModelMap modelMap, final RenderRequest renderRequest) {
        ...
    }

}

如果你的调用JSP有这样的东西,那么这可能有用:

<portlet:actionURL ... >
    <portlet:param name="action" value="viewDetails">
</portlet:actionURL>

构思3:为行动阶段添加一个空方法。

...
public class DetailsController {

    @RequestMapping(params = "action=viewDetails")    // render phase
    public String showDetails(final ModelMap modelMap, final RenderRequest renderRequest) {
        ...
    }

    ...
    // Empty method
    @RequestMapping(params = "action=viewDetails")    // action phase
    public void actionMethod() {
    }

}

如果你的调用JSP有这样的东西,那么这可能有用:

<portlet:actionURL ... >
    <portlet:param name="action" value="viewDetails">
</portlet:actionURL>

答案 1 :(得分:2)

首先要检查一下这里的事情:

  1. 是否有任何参数从jsp传递到控制器?
  2. 是否有一个默认的Action方法来处理空的param场景?
  3. 现在,如果对第一个问题的回答是肯定的,那么你的jsp应该有一个类似于......的actionURL标签。

            <portlet:actionURL var="myAction">
               <portlet:param name="paramName" value="paramVal" />
            </portlet:actionURL>
            <form:form action="${myAction}"...
    

    及其在Controller中的相应ActionMapping ...

            @ActionMapping(params = "paramName=paramVal" )
            public void myAction....
    

    如果对第二个问题的回答是否定的,那么在Controller中定义一个默认的动作方法,如...

           @ActionMapping(param="!action") 
           public void defaultAction....
    

    希望这有帮助!