【问题标题】:Injecting a SessionScoped Bean inside a View Scoped bean in JSF在 JSF 中的 View Scoped bean 中注入 SessionScoped Bean
【发布时间】:2014-09-13 21:31:09
【问题描述】:

我正在使用 Prime Faces 4.0 在 JSF 2.0 中构建一个 Web 应用程序。在我的项目中,我有使用 Prime Faces 的图像上传功能。我的要求是:有一个选择按钮,用户将通过该按钮浏览,然后通过上传按钮 图片将被上传,但不会保存在数据库中。点击保存按钮后,页面中有一个单独的保存按钮,图片将保存在数据库中。

但我的问题是::为了上传图像,我有一个在 SessionScoped 中的 managedBean calle ImageController.java,保存按钮由一个 actionlistener 方法组成,该方法在 ViewScoped 中的 managedBean 类中定义。

我提供 ImageController.java 类的代码

   package com.edfx.tum.web.controller;

   import java.io.ByteArrayInputStream;
   import java.io.FileNotFoundException;
   import java.io.IOException;
   import java.io.Serializable;
   import javax.annotation.PostConstruct;
   import javax.faces.bean.ManagedBean;
   import javax.faces.bean.SessionScoped;
   import org.primefaces.event.FileUploadEvent;
   import org.primefaces.model.DefaultStreamedContent;
   import org.primefaces.model.StreamedContent;
   import org.primefaces.model.UploadedFile;
   import com.edfx.tum.dto.UserDTO;


  @SessionScoped
  @ManagedBean(name = "imageController")
  public class ImageController extends BaseWebController implements Serializable {

 private static final long serialVersionUID = -3975946403680318499L;

 private StreamedContent image;
 private byte[] uploadedImage;



public void initImage() {

    UserDTO user = getCurrentUser();
    byte[] img = user.getUserPhoto();
    setUploadedImage(img);
    if (img != null) {
        image = new DefaultStreamedContent(new ByteArrayInputStream(img));
    } else {
        image = null;
    }
}

public StreamedContent getImage() {
    return this.image;
}



public byte[] getUploadedImage() {
    return uploadedImage;
}

public void setUploadedImage(byte[] uploadedImage) {
    this.uploadedImage = uploadedImage;
}


public void setImage(StreamedContent image) {
    this.image = image;
}


@PostConstruct
public void init() throws FileNotFoundException, IOException {
    initImage();
}

    public void handleFileUpload(FileUploadEvent event) {
    UploadedFile uploadedFile = event.getFile();

    byte[] img = uploadedFile.getContents();

    image = new DefaultStreamedContent(new ByteArrayInputStream(img));
    setUploadedImage(img);
 }
}

保存按钮的 actionlistener 绑定到的 managedBean 的名称是 UserDetailsController 并且通过以下方式我将依赖项注入到 UserDetailscontroller.java 类中

@ViewScoped
@ManagedBean(name = "userDetailsController")
public class UserDetailsController extends BaseWebController implements Serializable {
@ManagedProperty(value = "#{imageController}")
private ImageController imageController;

public ImageController getImageController() {
    return imageController;
}

public void setImageController(ImageController imageController) {
    this.imageController = imageController;
 }

  //other codes here

  public void submit(ActionEvent actionEvent) {
    try {
        UserDTO userDTO = (UserDTO) actionEvent.getComponent().getAttributes().get("user");
        if (userDTO != null) {
            userDTO.setUserPhoto(imageController.getUploadedImage());
            processDBPeopleUpdate(userDTO);
        }
    } catch (Exception e) {
        LoggingUtils.printStackTrace(e, log);
    }
  }  
}

不要担心“processDBPeopleUpdate(userDTO);”将其编码为普通的 saveOrUpdate() 方法,用于将 dto 保存到数据库。

下面是一段xhtml代码::

  <p:fileUpload id="fileUpload" styleClass="imageStyle" mode="advanced" dragDropSupport="false" update="myProfileForm:growl myProfileForm:profileImage"     sizeLimit="1000000" fileUploadListener="#{imageController.handleFileUpload}" allowTypes="/(\.|\/)(gif|jpeg|png|tiff|exif)$/"/>

现在,我面临的问题是,单击保存按钮后,图片会保存在数据库中。但是一旦我更改了标签,例如:保存图片后,此功能现在位于“我的个人资料”标签中如果我将点击更改为用户(假设),则在数据库中,我再次转到“我的个人资料”选项卡,图片未显示

再次,如果我注销然后登录并再次转到“我的个人资料选项卡”,图片正在显示。所以,总之,我想说的是,在选项卡更改时图像不会持续存在。

任何人都可以为此提供任何合适的解决方案吗?

【问题讨论】:

  • 那么,CDI Bean 注入真的与渲染/保存数据有关吗? - xhtml 会很高兴看到您的更新/渲染部分是什么样的,而且您的数据库也很重要,如果它没有正确保存,那么它当然不会显示它!

标签: java primefaces


【解决方案1】:

我假设您在 xhtml 中使用 StreamedContent。如果是这样,问题是当您在userDetailsController 中设置uploadedImage 时,您没有更新imageController.image 属性。您只需在 @PostConstruct 上初始化此属性。

【讨论】:

  • ImageController 类在 sessionscope 中,在调用 handleFileUpload() 方法期间,我正在使用新上传的值设置图像属性。因此,它应该保持不变。
  • 你也可以附上你的xhtml吗?也许它应该对我们有所帮助。另外,你是使用el缓存还是视图池?
猜你喜欢
  • 2016-08-02
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 2013-01-26
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多