[我的设置:Java EE 6应用程序,带有EJB3.1,CDI/Weld,在Glassfish 3.0.1上运行的JSF2]
我刚刚在这个页面上阅读了Faces ProjectStage ,这很酷.所以我在我的Web.xml中配置它,将其设置为Development:
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
现在我想从JSF视图访问ProjectStage(相应地设置特定UI组件的可见性).
因此,我已经尝试过像输出文本这样的值#{javax.application.projectStage},它似乎是null,我也尝试了许多其他变种,但没有成功.我甚至无法从Java代码中访问ProjectStage(然后我可以用Bean自己公开它).
如何访问应用程序中的PROJECT_STAGE值?
我正在使用Glassfish 3.1,B06开发Java EE 6应用程序.为了保护我的应用程序,我正在使用JDBCRealm和编程安全性.这可以很好地检查用户名和密码.但是当谈到声明安全角色时,我遇到了一个问题:
要在Java EE 6中使用安全角色,我必须在EJB部署描述符和Glassfish特定的部署描述符中声明这些角色以链接这些角色(如Java EE 6教程中所述)仅我可以使用方法isCallerInRole(String roleRef)在EJB内部检查权限.
这对我的应用程序来说是不可取的,因为我希望能够动态地和以编程方式添加安全角色,而不必编写XML文件(例如,可以在数据库中定义角色名称).
我刚刚通过GF3源代码进行了调试,并在com.sun.ejb.containers.EjbContextImpl中看到了isCallerInRole的实现.容器从EJB描述符中获取角色:
public boolean isCallerInRole(String roleRef) {
(...)
EjbDescriptor ejbd = container.getEjbDescriptor();
RoleReference rr = ejbd.getRoleReferenceByName(roleRef);
(...)
}
Run Code Online (Sandbox Code Playgroud)
我环顾四周,发现如果我能以某种方式在我的应用程序中获取EJB描述符,我可以添加这样的角色:
EjbDescriptor ejbd = //??? Can i use that descriptor inside my app, or is that "forbidden"?
RoleReference rr = new RoleReference("admin", "Admins are allowed to do everything");
ejbd.addRoleReference(rr);
Run Code Online (Sandbox Code Playgroud)
有人做过这样的事情,还是对此有所了解?是否可以在我的应用程序中使用Ejb部署描述符?还是有更好的方法?
PS或我应该使用MBeans添加角色?在这里找到一个相关的帖子.
我想为一个(相当复杂的)Bash完成脚本编写一个单元测试,最好用Python编写 - 只需要以编程方式获取Bash完成的值.测试应如下所示:
def test_completion():
# trigger_completion should return what a user should get on triggering
# Bash completion like this: 'pbt createkvm<TAB>'
assert trigger_completion('pbt createkvm') == "module1 module2 module3"
Run Code Online (Sandbox Code Playgroud)
如何以编程方式模拟Bash完成以检查我的工具的测试套件内的完成值?
我想从我的pom.xml中提取属性文件中的所有属性.这些是常见的属性,如依赖版本,插件版本和目录.我正在使用properties-maven-plugin,但它不能像我想要的那样工作.
我的pom.xml的基本部分:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-1</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>${basedir}/pom.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
现在,当我运行"mvn属性:read-project-properties"时,我收到以下错误:
[INFO] One or more required plugin parameters are invalid/missing for 'properties:read-project-properties'
[0] Inside the definition for plugin 'properties-maven-plugin' specify the following:
<configuration>
...
<files>VALUE</files>
</configuration>.
Run Code Online (Sandbox Code Playgroud)
pom.properties文件与pom.xml位于同一目录中.我该怎么做才能让properties-maven-plugin读取我的属性文件?
编辑
我在http://jira.codehaus.org/browse/MOJO-1523提交了一个问题.它已被关闭为"不是一个bug",原因是:
这是设计的.项目定义必须是自包含的,否则如果从别处作为传递deps的一部分引用它则不再完整.
我正在尝试使用Scala 2.8实现JavaEE会话Bean.
因为它是一个远程会话Bean,我必须使用以下Java Annotation对其进行注释:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Remote {
Class[] value() default {};
}
Run Code Online (Sandbox Code Playgroud)
我只为scala 2.7 找到了这个例子.在Scala 2.7中,可以像这样定义会话bean:
@Remote {val value = Array(classOf[MyEJBRemote])}
class MyEJB
...
Run Code Online (Sandbox Code Playgroud)
如何使用Scala 2.8以相同的方式使用此注释?我已经尝试了许多不同的版本,所有这些都导致"注释参数需要是一个常量","非法启动简单表达式".所有这些定义都不起作用:
@Remote{val value = Array(classOf[MyEJBRemote])}
@Remote(val value = Array(classOf[MyEJBRemote]))
@Remote(Array(classOf[MyEJBRemote]))
Run Code Online (Sandbox Code Playgroud) 我有以下装饰器,它在@saveconfig调用装饰的方法后保存配置文件:
class saveconfig(object):
def __init__(self, f):
self.f = f
def __call__(self, *args):
self.f(object, *args)
# Here i want to access "cfg" defined in pbtools
print "Saving configuration"
Run Code Online (Sandbox Code Playgroud)
我在下面的类中使用这个装饰器.createkvm调用该方法后,配置对象self.cfg应保存在装饰器中:
class pbtools()
def __init__(self):
self.configfile = open("pbt.properties", 'r+')
# This variable should be available inside my decorator
self.cfg = ConfigObj(infile = self.configfile)
@saveconfig
def createkvm(self):
print "creating kvm"
Run Code Online (Sandbox Code Playgroud)
我的问题是我需要访问self.cfg装饰器内的对象变量saveconfig.第一个天真的方法是向装饰器添加一个参数来保存对象@saveconfig(self),但这不起作用.
如何在装饰器中访问方法主机的对象变量?我是否必须在同一个类中定义装饰器才能获得访问权限?
我在XStream的帮助下将对象序列化为XML.如何告诉XStream将xmlns插入到对象的XML输出中?
作为一个例子,我有这个我要序列化的简单对象:
@XStreamAlias(value="domain")
public class Domain
{
@XStreamAsAttribute
private String type;
private String os;
(...)
}
Run Code Online (Sandbox Code Playgroud)
如何使用XStream 完全实现以下输出?
<domain type="kvm" xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0">
<os>linux</os>
</domain>
Run Code Online (Sandbox Code Playgroud) 我使用PIP打包我的Python应用程序,提供了setup.py.在安装过程中,我想询问用户多个值(用户名,其他配置值),然后将这些值保存在用户目录中存储的应用程序配置文件中.
在安装过程中是否有特殊的PIP/distutils方式来询问这些配置值?或者我应该用它input来询问用户,如下所示:
#!/usr/bin/env python
from distutils.core import setup
cfg['name'] = input("Please your username:")
cfg.save()
setup(name='appname',
version='1.0',
description='App Description',
author='Author',
author_email='author@author.net',
packages=['mypackage'],
)
Run Code Online (Sandbox Code Playgroud)
或者我应该不考虑这些值,而是让用户在第一次启动时配置应用程序?
我知道所有这些方法都是可能的,但是有没有任何约定或最佳实践呢?或者你知道一个流行的Python项目做类似的东西,这是一个很好的例子?
我想与Virtualbox-VM进行交互,以无人值守地安装Virtualbox-Guest-Additions.因此,我必须向VM发送击键.我可以通过使用VBoxManage-API来实现这一点,我将扫描码的HEX发送到VM:
# sends "b" to the VM
VBoxManage controlvm "$VMNAME" keyboardputscancode <HEX>
Run Code Online (Sandbox Code Playgroud)
现在我想向VM发送一个完整的命令,例如:
mount /dev/scd0 /media/cdrom0<Enter>
Run Code Online (Sandbox Code Playgroud)
因此,我必须将该字符串的每个字符转换为扫描码,并使用VBoxManage将其发送到VM.
如何将这些字符转换为Linux上相应的键盘扫描码?我的VM具有与主机相同的键盘映射.我正在寻找可以使用的东西:
$ getscancode n
> 31
Run Code Online (Sandbox Code Playgroud)
?
在我的IDE(Eclipse或NetBeans,无所谓)中,我有一些TestNG测试类(但我的问题也指远程JUnit测试),它们是Integration测试.这些测试需要集成服务器才能运行,它们无法在本地计算机上运行.他们需要集成服务器的完整环境 - 不仅仅是JavaEE容器相关的东西(=>没有Arquillian,也没有JEEUnit).
现在我希望能够在我的IDE(Eclipse)中运行这些测试 - 最好使用TestNG插件 - 但是当我启动它们时,它们实际上应该在远程集成服务器上运行.
是否可以从我的IDE中启动远程服务器上的集成测试?我喜欢在远程服务器上安装某种代理的想法,它等待测试请求并执行它们.但正如我所说,如果从TestNG插件内部运行它会很好.
我是否需要某种解决方法,例如Ant脚本(希望不是)或某些Maven魔法?什么是最佳做法?
我知道我也可以为我的应用程序创建Webservices,然后我可以从本地单元测试中调用它们.但我想知道是否还有没有Webservices的可能性.