有什么方法可以将接口的所有实现者(JSF Bean)注入到由 Spring 管理的服务中吗?

问题描述 投票:0回答:1

我有这个界面

public interface DataHandler {
    void getData();
    
    String getControllerPrefix();
}

它正在不同的控制器中实现,如下所示

@ManagedBean
@ViewScoped
public class MyController implements DataHandler{
       //some code
}

我想要做的是让所有实现该接口的控制器将它们注入到我的业务层的属性中。但由于我试图将 JSF beans (MyControllers) 注入由 spring (Business) 管理的 bean 中,所以无法正常工作

@Service
public class Business {
    @Any
    private final Instance<DataHandler> dataHandlers;

    public void getData(String controllerPrefix) {
        //logic to get the right controller and its data
    }

我一直在使用以下方法来获取 JSF beans 并在其自身上下文之外使用它们

public static <T> T getBeanFromFacesCtx(String beanQualifier, Class<T> clazz) {
        FacesContext ctx = FacesContext.getCurrentInstance();
        Application app = ctx.getApplication();
        T bean = app.evaluateExpressionGet(ctx, beanQualifier, clazz);
        return Optional.ofNullable(bean)
                .orElseThrow(() -> new UnsupportedOperationException("It was not possible to return the Bean " + beanQualifier));
    }

但是这次我正在寻找获得它的最佳方法。 有什么办法可以实现这个目标吗?

java jsf interface javabeans
1个回答
0
投票

您似乎试图在 JSF 上下文之外获取 JSF bean,因为它位于“servlet 代码”中,而不是隐式配置和调用 bean 的页面代码内。

提醒一下,JSF bean 仅具有数据上下文或良好的实践,以某种形式“绑定”到元素值! 或者使用 JSF 进行处理是荒谬的,并且它在另一个线程序列之后,只能使用“阶段”进行操作。 所需类的包装和层次结构是什么?它们是在 JSF 中吗(扩展的类或接口)。

public void getData 方法应该位于类 MyController 内,因为它实现了 getData 的实际代码! getHandler 是一个更好的名字,getData 至少应该获得结果,但更明智的是处理程序的数据输入!

getApplication() 我认为你正在尝试获取例如ApplicationContextFacade 通常(最终)是 Servlet 上下文或 PageContext,在 JSF 中是 FacesContext。 “JSF 运行时位于一个独立的子线程上”,因此在从 FacesContext 通过线程调用 ApplicationContext 时,访问应用程序的又名上下文是“瞬间的”。

引用我的一位文档...

不幸的是,在 JSF 中使用托管 bean 需要三个不同的步骤以及常量枚举或 url 集合 但这并没有使图形图像的页面编码输出更加灵活。 这也不允许服务器连接的利用和保护。 使用此 API 和 faces 可以将其简化为以下内容,对于 JSF 来说“在托管 bean 中”足够简单。 对于面孔应用程序,这些可以在 Oracle 1.8.0_202 中方便地运行 // jakarta.faces-3.0.0-RC5.jar jakarta.servlet.jsp.jstl-2.0.0.jar jakarta.inject-api-2.0.0.jar jakarta.annotation-api-62.jar

可以使用 jakarta.faces-3.0.0-RC5.jar 和 com.sun WebConfiguration 类在 jakarta faces 托管 bean 中获取以下内容 这是为了向后兼容而提供的,仅用于使用 com.sun 类。

public String makeImg(String umber){
// jakarta.faces-3.0.0-RC5.jar
WebConfiguration wbc = WebConfiguration.getInstance();
ServletContext appconxt = wbc.getServletContext();
WebAppToolRAMDataServingObj dat = (WebAppToolRAMDataServingObj)appconxt.getAttribute("DataStoreObj");
RamStringB64 b64obj = dat.getRAMStringB64Store();
imagedata = (b64obj.getRAMstringB64((int)new Integer(umber).intValue()));
return imagedata;
}

在 jakarta.faces 或 javax.faces now 中,仅提供以下内容,并且必须分别转换为 jakarta.servlet.ServletContext 或 javax.servlet.ServletContext [如果服务器应用程序不是 Portlet]。

public String makeImg(String umber){
//jakarta.faces-3.0.0.jar
// WARNING FROM HERE TO
jakarta.servlet.ServletContext appconxt = (jakarta.servlet.ServletContext)(jakarta.faces.context.FacesContext.getCurrentInstance()).getExternalContext().getContext();
WebAppToolRAMDataServingObj dat = (WebAppToolRAMDataServingObj)appconxt.getAttribute("DataStoreObj");
RamStringB64 b64obj = dat.getRAMStringB64Store();
// HERE MUST BE CALLED
// EACH SINGLE TIME WARNING DO NOT ATTEMPT GLOBAL SETUP WARNING
base64string = (b64obj.getRAMstringB64((int)new Integer(umber).intValue()));
return base64string;
}

此外,这似乎是您正在以某种方式做的事情,可以为特定的 MIME 类型编写自定义 DataContentHandler,它满足 DataHandler 的所有必需方法 javax.activation 接口 DataContentHandler

© www.soinside.com 2019 - 2024. All rights reserved.