1

@Actionアクションからおよびコンベンション プラグインの注釈を削除し、@Resultそれらを の同等の構成に置き換える際に問題が発生していstruts.xmlます。

package com.microed.cars.web;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

public class HomeAction extends ActionSupport {

    @Action(results = {
            @Result(location = "/jsp/home.jsp")
    })
    @Override
    public String execute() throws Exception {
        return super.execute();
    }
}

これらの注釈があれば、正常にアクセスできますlocalhost:port/context/home.action

注釈を削除すると、struts.xml に「すべてをキャプチャ」の結果があるにもかかわらず、「アクションの結果が定義されていません.....」という struts エラーが発生します。struts.xml 全体は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>
    <constant name="struts.devMode" value="true"/>
    <constant name="struts.convention.package.locators" value="web"/>
    <constant name="struts.convention.default.parent.package" value="beetroot"/>

    <package name="beetroot" extends="json-default">

        <action name="home" class="homeAction">
            <result>/jsp/home.jsp</result>
        </action>

        <action name="cars" class="baseCarsAction">
            <result name="input" type="json">
                <param name="root">autoResults</param>
                /jsp/home.jsp
            </result>
        </action>
    </package>
</struts>

オートコンプリート関数に json の結果の型が必要なため、json-default を拡張します。

homeActionクラスのアクション マッピングが取得されない理由がわかりません。アクションマッピング「車」を削除すると、オートコンプリートが無効になるため、読み取られていることがわかりstruts.xmlます(ただし、これを検証するには、削除しようとしている注釈が必要です)。

「結果が定義されていません」は単純なエラーであり、通常はスペル/大文字化のエラーが原因であることはわかっていますが、ここでは絶対にそうではありません.「ホーム」アクションマッピング全体を単に無視しているようです.

をステップスルーするときDefaultActionInvocation.createResult、照合しようとする「結果」はまったくありません。

4

1 に答える 1

2

As it stands the cars action declaration isn't valid (nor does it make sense, IMO):

<action name="cars" class="baseCarsAction">
  <result name="input" type="json">
    <param name="root">autoResults</param>
    <param name="location">/jsp/home.jsp</param>
  </result>
</action>

That said: if it's a JSON result, a JSP isn't helpful, and it'll be ignored (or downright rejected, I'm not sure if it's an error or not). A single result will be either JSON, or HTML.

Turn logging up to DEBUG level to catch startup errors to narrow the range of possible causes.

If baseAction is configured in your Spring config file (which is unnecessary if you're using Spring annotations for injection) the configuration for the home action is valid.

I'd be wary of deploying the convention plugin if you're not actually using it: it changes how actions are mapped; it may have an impact on the surrounding application and cause problems. Stick with one or the other, avoid both–it makes it harder to reason about the source of application behavior.

Unrelated, but I recommend putting JSP pages under /WEB-INF to disallow direct client access.

于 2013-01-29T15:33:17.150 に答える