群里 @李正軍(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工具得到的结果:
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