I've worked around the problem inconsistent JSON results by removing the 
root parameter from the JSONResult annotations.  It appears that
at least I'm getting consistent results this way:

 @Results( {
        @Result(name = "jsonPopsResult", type = JSONResult.class, value = 
"", params = {"noCache", "true"}),
        @Result(name = "jsonRefugesResult", type = JSONResult.class, value 
= "", params = {"noCache", "true"})})

The params attribute was previously

        params = {"root", "jsonResult", "noCache", "true"}

Fortunately, the jsonResult property on the action is the only 
non-base-class property, so I'm still returning only what I need.

FYI, as was suggested, I tried configuring the action via xml instead of 
annotations, but for some reason couldn't get the 
action's results to be recognized:
 
    <package name="wizard" extends="myapp" namespace="/wizard">
        <action name="mapQuery" 
class="gov.doi.myapp.actions.wizard.MapQueryAction">
            <result name="jsonPopsResult" type="json">
                <param name="root">jsonResult</param>
            </result>
            <result name="jsonRefugesResult" type="json">
                <param name="root">jsonResult</param>
            </result>
        </action>
    </package>

I got "No result defined for action 
gov.doi.myapp.actions.wizard.MapQueryAction and result success".  Probably 
some
stupid error on my part, but I don't have time to work on it further right 
now.  If I ever ascertain that the problem goes away
with xml config, I'll let the list know.

> he must be passing in JSONResult in one of the params to Action

I am not passing in JSONResult to the action.  The parameters passed 
(since I suspect you'll ask :-) are

filter=false
layerId=0
layerName=Section 7 Range
nelat=43.689721907017194
nelon=-116.00601196289062
swlat=43.51469675271005
swlon=-116.41937255859374
zoomlevel=11

> can we see web.xml struts.xml and struts-default.xml
> and struts-config.xml
> please display ALL xml files for your project

For what it is worth, the XML files appear below, edited to remove/change 
irrelevant and security sensitive areas
There is no struts-config.xml.  I'm using the struts-default.xml from the 
core jar.

------------------------------

struts.xml (version used when configuring json plugin via annotations):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd";>
<struts>
    <include file="struts-plugin.xml"/>
 
    <package name="myapp" extends="struts-default" namespace="/">
        <interceptors>
            <interceptor-stack name="myappStack">
                <interceptor-ref name="defaultStack">
                    <param 
name="validation.validateAnnotatedMethodOnly">true</param>
                    <param 
name="validation.excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
            </interceptor-stack>
        </interceptors>
 
        <default-interceptor-ref name="myappStack"/>

        <global-results> 
            <result name="session-expired" 
type="redirect">/sessionExpired.jsp</result>
        </global-results>
    </package>
 
    <package name="wizard" extends="myapp" namespace="/wizard"/>
    <package name="wizardpdf" extends="myapp" namespace="/wizard/pdf"/>
    <package name="info"   extends="myapp" namespace="/info"/>
 
    <package name="crud" extends="myapp" namespace="/crud">
        <action name="*/*" method="{2}"
        class="gov.doi.myapp.actions.crud.{1}Action">
            <result type="redirect">/crud/{1}/view.action</result>
            <result name="view">/crud/{1}/view.jsp</result>
            <result name="input">/crud/{1}/edit.jsp</result>
            <result name="list">/crud/{1}/list.jsp</result>
            <result name="search">/crud/{1}/search.jsp</result>
            <result 
name="searchResults">/crud/{1}/searchResults.jsp</result>
            <result 
name="resourceSelect">/crud/{1}/resourceSelect.jsp</result>
            <result 
name="activitySelect">/crud/{1}/activitySelect.jsp</result>
            <interceptor-ref name="paramsPrepareParamsStack"/>
        </action>
    </package>
</struts>

------------------------------

struts.xml (version used when configuring json plugin via struts.xml):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd";>
<struts>
    <include file="struts-plugin.xml"/>
 
    <package name="myapp" extends="json-default" namespace="/">
        <interceptors>
            <interceptor-stack name="myappStack">
                <interceptor-ref name="defaultStack">
                    <param 
name="validation.validateAnnotatedMethodOnly">true</param>
                    <param 
name="validation.excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
            </interceptor-stack>
        </interceptors>
 
        <default-interceptor-ref name="myappStack"/>

        <global-results> 
            <result name="session-expired" 
type="redirect">/sessionExpired.jsp</result>
        </global-results>
    </package>
 

    <package name="wizard" extends="myapp" namespace="/wizard">
        <action name="mapQuery" 
class="gov.doi.myapp.actions.wizard.MapQueryAction">
            <result name="jsonPopsResult" type="json">
                <param name="root">jsonResult</param>
            </result>
            <result name="jsonRefugesResult" type="json">
                <param name="root">jsonResult</param>
            </result>
        </action>
    </package>
    <package name="wizardpdf" extends="myapp" namespace="/wizard/pdf"/>
    <package name="info"   extends="myapp" namespace="/info"/>
 
    <package name="crud" extends="myapp" namespace="/crud">
        <action name="*/*" method="{2}"
        class="gov.doi.myapp.actions.crud.{1}Action">
            <result type="redirect">/crud/{1}/view.action</result>
            <result name="view">/crud/{1}/view.jsp</result>
            <result name="input">/crud/{1}/edit.jsp</result>
            <result name="list">/crud/{1}/list.jsp</result>
            <result name="search">/crud/{1}/search.jsp</result>
            <result 
name="searchResults">/crud/{1}/searchResults.jsp</result>
            <result 
name="resourceSelect">/crud/{1}/resourceSelect.jsp</result>
            <result 
name="activitySelect">/crud/{1}/activitySelect.jsp</result>
            <interceptor-ref name="paramsPrepareParamsStack"/>
        </action>
    </package>
</struts>


------------------------------

Here's the web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"; xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd";>

    <!-- ======================================-->
    <!-- listener                              -->
    <!-- ======================================-->

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
 
    <!-- ======================================-->
    <!-- filter: openEntityManager             -->
    <!-- binds a JPA EntityManager to the thread -->
    <!-- for the entire processing of the request -->
    <!-- ======================================-->

    <filter>
        <filter-name>openEntityManager</filter-name>
 
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>openEntityManager</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- ======================================-->
    <!-- filter: transactionFilter             -->
    <!-- Ensures proper commiting and rollback -->
    <!-- of Transaction                        -->
    <!-- ======================================-->

    <filter>
        <filter-name>transactionFilter</filter-name>
        <filter-class>gov.doi.tat.spring.TransactionFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>transactionFilter</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>
 
    <!-- ======================================-->
    <!-- filter: struts 2                      -->
    <!-- ======================================-->

    <filter>
        <filter-name>struts</filter-name>
 
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
        <init-param>
            <param-name>actionPackages</param-name>
            <param-value>gov.doi.myapp.actions</param-value>
        </init-param>
        <init-param>
            <param-name>struts.devMode</param-name>
            <param-value>@struts.devMode@</param-value>
        </init-param>
        <init-param>
            <param-name>struts.enable.DynamicMethodInvocation</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>struts.enable.SlashesInActionNames</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>

</web-app>

Reply via email to