我正在使用一个自定义的注释安全性,如本链接所述。我正在将我的jsf托管bean从@ManagedBean升级为@Named(CDI)。由于CDI不支持作用域@ViewScoped,所以我使用org.omnifaces.CDI.ViewScoped。但是,在这种情况下,如果method.isAnnotationPresent(permissao.class){}
检查失败。我应该如何调整我的安全检查来使用CDI+ViewScoped从OmniFaces?
使用@managedbean/viewscoped(jsf)而不是@named/viewscoped(cdi+omnifaces)起作用。此问题出现在该行if(Metodo.IsAnnotationPresent(PermissAo.Class)){}
中
public void verificaPermissaoAcesso(ActionEvent event) {
final FacesContext facesContext = FacesContext.getCurrentInstance();
UIComponent source = event.getComponent();
ActionSource2 actionSource = (ActionSource2) source;
MethodExpression methodExpression = actionSource.getActionExpression();
String expressao = methodExpression.getExpressionString(); // #{nomeManagedBean.nomeMetodo(param)}
String nomeManagedBean = expressao.substring(0, expressao.indexOf('.')).substring(2);
String nomeMetodoComParenteses = expressao.substring(expressao.indexOf('.') + 1);
String nomeMetodo = nomeMetodoComParenteses.substring(0, nomeMetodoComParenteses.indexOf("("));
ELContext elContext = facesContext.getELContext();
ExpressionFactory factory = facesContext.getApplication().getExpressionFactory();
ValueExpression ve = factory.createValueExpression(elContext, "#{" + nomeManagedBean + '}', Object.class);
//Object jsfManagedBean = ve.getValue(elContext);
Context ctx = bm.getContext(org.omnifaces.cdi.ViewScoped.class);
Bean bean = bm.resolve(bm.getBeans(nomeManagedBean));
Object jsfManagedBeanProxy = ctx.get(bean);
List<Method> listaMetodos = Arrays.asList(jsfManagedBeanProxy.getClass().getMethods());
for (Method metodo : listaMetodos) {
if (nomeMetodo.equals(metodo.getName())) {
if (metodo.isAnnotationPresent(Permissao.class)) {
Permissao anotacaoSeguranca = metodo.getAnnotation(Permissao.class);
SegurancaUtil.verificar(anotacaoSeguranca.acoes());
break;
}
}
}
}
我得批注类
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Permissao {
String[] acoes();
}
我在jsf托管bean中的注释方法
@Permissao(acoes={"permission1", "permission2"})
public void myMethod(long id) {}
Context ctx = bm.getContext(org.omnifaces.cdi.ViewScoped.class);
Bean bean = bm.resolve(bm.getBeans(nomeManagedBean));
Object jsfManagedBeanProxy = ctx.get(bean);
CDI不注入一个裸的CDI bean作为依赖项,而是一个重定向到活动范围的上下文对象的代理。此代理类没有您的批注。
请参见https://issues.jboss.org/browse/CDI-10了解如何解包代理。
Guice还提供了另一种映射绑定的方法,而无需创建自定义注释。 它允许使用@Named注释。 使用命名注释进行映射 bind(SpellChecker.class).annotatedWith(Names.named("OpenOffice")).to(OpenOfficeWordSpellCheckerImpl.class); 使用@Named注释进行注入 @Inject public Tex
管道用于相关过程之间的通信。 我们可以使用管道进行无关的进程通信吗,比方说,我们想从一个终端执行客户端程序,从另一个终端执行服务器程序? 答案是否定。那么我们如何才能实现无关的流程沟通,简单的答案就是命名管道。 即使这适用于相关流程,但使用命名管道进行相关流程通信也没有任何意义。 我们使用一个管道进行单向通信,使用两个管道进行双向通信。 相同条件是否适用于命名管道。 答案是否定的,我们可以使用单个
主要内容:使用@Named 注解映射,使用@Named 注解注入,Google Guice @Named 注解完整示例,输出Google Guice 还提供了另一种无需创建自定义注释即可映射绑定的方法。它允许使用@Named 注解。 使用@Named 注解映射 使用@Named 注解注入 Google Guice @Named 注解完整示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。
ember-named-yields A stop-gap for the named yields RFC and based off the experimentation here. Demo Install ember install ember-named-yields Usage Setup the named yields in your component template: {{
描述 (Description) 如果此元素上存在指定类型的注释,则java.lang.reflect.AccessibleObject.isAnnotationPresent(Class《? extends Annotation》 annotationClass)方法返回true,否则返回false。 声明 (Declaration) 以下是java.lang.reflect.Accessibl
In the Navigate to a new screen and back recipe, we learned how to Navigate to a new screen by creating a new route and pushing it to the Navigator. However, if we need to navigate to the same screen