【问题标题】:Tommahawk Myfaces and CDITommahawk Myfaces 和 CDI
【发布时间】:2014-01-10 05:54:16
【问题描述】:

在尝试创建 JSF 页面以上传文件时,我在使用带有 Tommahawk Myfaces 的 CDI 时遇到了一些问题。提到这个问题,Tommahawk MyFaces 似乎与 CDI 不兼容,但这是正确的吗?

我的豆子是这样的:

@ManagedBean
@RequestScoped
public class Bean {
private UploadedFile uploadedFile;

public void submit() throws IOException {
    String fileName = FilenameUtils.getName(uploadedFile.getName());
    String contentType = uploadedFile.getContentType();
    byte[] bytes = uploadedFile.getBytes();

    // Now you can save bytes in DB (and also content type?)

    FacesContext.getCurrentInstance().addMessage(null, 
        new FacesMessage(String.format("File '%s' of type '%s' successfully uploaded!", fileName, contentType)));
    }

    public UploadedFile getUploadedFile() {
        return uploadedFile;
    }

    public void setUploadedFile(UploadedFile uploadedFile) {
        this.uploadedFile = uploadedFile;
    }
}

但是,当我将 @ManagedBean@RequestScoped 替换为 @Named@Model 时,我会在部署时收到以下警告:

WELD-001529 为没有任何适当构造函数的类 org.apache.myfaces.webapp.filter.TomahawkFacesContextFactory 创建了一个 InjectionTarget 实现。

当我使用以下 JSF 页面上传文件时,当我使用 @Named@Model 时,UploadedFile 的值为 null。但不是@ManagedBean' and@RequestScope. This is the.xhtml`文件,我确实使用tommahawk Myfaces:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:t="http://myfaces.apache.org/tomahawk"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>Tomahawk file upload demo</title>
    </h:head>
    <h:body>
        <h:form enctype="multipart/form-data">
            <t:inputFileUpload value="#{bean.uploadedFile}" />
            <h:commandButton value="submit" action="#{bean.submit()}" />
            <h:messages />
        </h:form>
    </h:body>
</html>

所以我假设 CDI 不喜欢 tomahawk 库,因为没有默认构造函数?

【问题讨论】:

  • 尝试设置扩展过滤器。你可以找到更多关于它的信息Here
  • 扩展过滤器已经设置好,因为它与@ManagedBean 一起使用。我只是没有显示它的 XML。

标签: jakarta-ee cdi myfaces


【解决方案1】:

查看“Begginning Java EE 7”,它指定 CDI 1.1 将任何类视为 CDI bean,它进行了统计(除其他外):

它有一个没有参数没有参数的默认构造函数, 或者它声明了一个带有 @Inject 注释的构造函数。

看起来TomahawkFacesContextFactory 不满足这个要求。

** 编辑 ** 以上似乎是confirmed in the CDI specification here. 我也已经切换到 PrimeFaces 并且这与 CDI 有类似的问题但是我没有在他们的announcement here 上表示:

PrimeFaces 5.0 将附带注释支持的新组件模型,并且兼容 CDI(或 Spring 或 Guice!)。

【讨论】:

  • 我明白了。很奇怪,因为 CDI 不应该弄乱任何 JSF 工件,但理论上它很容易修复。我创建了TOMAHAWK-1671 来进一步调查这个话题。
猜你喜欢
  • 2014-03-28
  • 2013-04-23
  • 2011-02-27
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2015-02-14
  • 2014-09-29
  • 1970-01-01
相关资源
最近更新 更多