2013-12-21 7 views
0

У меня возникли проблемы с использованием CDI с Tommahawk Myfaces при попытке создать страницу JSF для загрузки файла. Ссылаясь на этот вопрос, похоже, что Tommahawk MyFaces не совместим с CDI, но это правильно?Tommahawk Myfaces и CDI

Мои Bean, как это:

@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 реализация InjectionTarget создается для класса org.apache.myfaces.webapp.filter.TomahawkFacesContextFactory, у которого нет соответствующего конструктора.

И когда я загрузить файл с помощью следующей JSF страницы, значение UploadedFile равно нулю, когда я использую @Named или @Model. но не с @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> 

Так я полагаю, КДИ не любит библиотеку Tomahawk, поскольку нет конструктора по умолчанию не?

+0

Попробуйте настроить фильтр расширений. Вы можете найти дополнительную информацию об этом [Здесь] (http://myfaces.apache.org/tomahawk/extensionsFilter.html) – lu4242

+0

Фильтр расширений уже настроен, поскольку он работает с @ManagedBean. Я просто не показал XML для него. – Kerry

ответ

0

Глядя на «Begginning Java EE 7», это указывает, что CDI 1.1 обрабатывает любой класс как КДИ боба, который statifies (среди прочего):

Он имеет конструктор по умолчанию без параметров без каких-либо параметров, или это объявляет конструктор аннотированный @Inject.

Похоже, что TomahawkFacesContextFactory не выполняет это требование.

** EDIT ** выше, кажется, confirmed in the CDI specification here. я переключился на PrimeFaces тоже и снова это имеет аналогичные проблемы с КДИ, однако я не на их announcement here что:

PrimeFaces 5.0 поставляются с новая модель компонента, поддерживаемая аннотацией, и совместимая с CDI (или Spring или Guice!).

+0

Я вижу. Довольно странно, потому что CDI не должен возиться с любыми артефактами JSF, но теоретически это просто исправить. Я создал [TOMAHAWK-1671] (https://issues.apache.org/jira/browse/TOMAHAWK-1671) для дальнейшего изучения этой темы. – lu4242