探讨: org.jboss.seam.security.management.roleAction无法使用@In注入?

13 views
Skip to first unread message

Dearshor Xue

unread,
Mar 8, 2010, 10:35:18 AM3/8/10
to Keep Leaping
群里 @李正軍(109625163) 曾提出这样的问题:
@Name("org.jboss.seam.security.management.roleAction")
注入RoleAction组件不成功!
组件申明,此为Seam内置组件。
@Scope(CONVERSATION)
@Install(precedence = BUILT_IN)
public class RoleAction implements Serializable
注入时是这样写的:
@In
RoleAction roleAction;
但得到的是null。
经本人测试,情况却并非如此.

我使用的seam版本: 2.2.0.GA
使用分发包里的seamspace例子做为测试对象

使用seam的debug工具得到的结果:
seam-debug.jpg


testng测试用例如下:
=========================================================
org.jboss.seam.example.seamspace.test.SecurityTest
---------------------------------------------------------
package org.jboss.seam.example.seamspace.test;

import org.jboss.seam.example.seamspace.RoleActionWrap;
import org.jboss.seam.mock.SeamTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

/**
 * 测试seam security feature
 * @author dearshor
 *
 */
public class SecurityTest extends SeamTest {
   

    @BeforeClass
    public void setup() {
    }
   
    /**
     * 测试seam security feature
     * 如果将第41行注释掉, 这个test将fail: Caused by: org.jboss.seam.RequiredException: @In attribute requires non-null value: roleActionWrap.roleAction
     
如果将org.jboss.seam.example.seamspace.RoleActionWrap.roleAction声明为:
          
@In(create = true)
            private RoleAction roleAction;

       则roleActionWrap.getRoleAction()始终返回非null
     *
     * @throws Exception
     */
    @Test
    public void testSecurityFeature() throws Exception {
       
        /*
         * new FacesRequest("/roledetail.xhtml") {...}
         */
        new FacesRequest() {

            /* (non-Javadoc)
             * @see org.jboss.seam.mock.AbstractSeamTest.Request#invokeApplication()
             */
            @Override
            protected void invokeApplication() throws Exception {
                // TODO Auto-generated method stub
line:41       assert invokeAction("#{roleAction.createRole}") == null;
                RoleActionWrap roleActionWrap = (RoleActionWrap) getInstance("roleActionWrap");
                assert roleActionWrap.getRoleAction() != null;
            }
           
        }.run();
       
    }

}


=========================================================
org.jboss.seam.example.seamspace.RoleActionWrap
---------------------------------------------------------
package org.jboss.seam.example.seamspace;

import java.io.Serializable;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.security.management.action.RoleAction;

/**
 * A funny component to wrap {@link org.jboss.seam.security.management.roleAction}
 * @author dearshor
 *
 */
@Name("roleActionWrap")
@Scope(ScopeType.CONVERSATION)
public class RoleActionWrap implements Serializable {
   
    /**
     * serial version UID
     */
    private static final long serialVersionUID = -1833441943358698061L;
   
    @In
    private RoleAction roleAction;

    /**
     * @param roleAction the roleAction to set
     */
    public void setRoleAction(RoleAction roleAction) {
        this.roleAction = roleAction;
    }

    /**
     * @return the roleAction
     */
    public RoleAction getRoleAction() {
        return roleAction;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return String.format("\nRoleActionWrap [\n\r" +
                "roleAction=[\n\r\r" +
                "role=%s,\n\r\r" +
                "AssignableRoles=%s\n\r]\n],",
                roleAction.getRole(),
                roleAction.getAssignableRoles(),
                roleAction.getGroups());
    }
   
   
}

=========================================================
src/org/jboss/seam/example/seamspace/test/testng.xml
---------------------------------------------------------

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >

<suite name="SeamSpace" verbose="2" parallel="false">

   <test name="SeamSpace: Register">
     <classes>
       <class name="org.jboss.seam.example.seamspace.test.RegisterTest"/>
     </classes>
   </test>
  
   <test name="SeamSpace: Blog">
     <classes>
       <class name="org.jboss.seam.example.seamspace.test.BlogTest"/>
     </classes>
   </test>
  
   <test name="SeamSpace: Security Management">
       <classes>
           <class name="org.jboss.seam.example.seamspace.test.SecurityTest"/>
       </classes>
   </test>
   
</suite>


附件为上述测试用例的源代码, 下载后将其解包至${seam.dist.path}/examples目录下, ${seam.dist.path}代表seam分发包所在位置,打开命令行, cd至${seam.dist.path}/examples/seamspace,运行ant test, 即可运行上述测试用例.

-- 
Best regards and wishes.

Dearshor(第二少) | Software Developer | Shanghai China
seamspace.zip
Reply all
Reply to author
Forward
0 new messages