6

我正在尝试找出为什么会引发以下异常。

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

以下异常集中的“参数映射”在哪里?

org.springframework.web.portlet.NoHandlerFoundException:没有为portlet请求找到匹配的处理程序方法:模式“视图”,阶段“ACTION_PHASE”,参数映射[空]

这是控制器:

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

2 回答 2

6

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

想法 1:删除("VIEW")showDetails @RequestMapping 注释。

...
public class DetailsController {

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

}

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

想法 2:为您的 @RequestMapping 方法注释指定操作参数。

...
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>
于 2012-10-09T19:57:04.367 回答
2

首先要在这里检查几件事:

  1. 是否有任何参数从 jsp 传递到控制器?
  2. 是否有默认的 Action 方法来处理空参数场景?

现在,如果对第一个问题的回答是肯定的,那么您的 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....

如果第二个问题的答案是否定的,那么在控制器中定义一个默认的操作方法,比如......

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

希望这可以帮助!

于 2012-10-08T12:03:17.637 回答