无法在JSP文件上显示使用Hibernate检索的图像

时间:2014-11-18 08:39:13

标签: java spring hibernate jsp

我正在开发一个Spring-MVC应用程序。我想在数据库中保存图像并将它们显示在应用程序的JSP页面中。目前我能够在数据库中保存图像,但无法在前端显示它们。 图像不会显示,当我点击查看图像时,我收到一个Apache错误:

HTTP Status 404 - /product/%5BB@a2e6ab9

我通常认为,这将是二进制图像,显示的图像在点击视图时将显示完整的二进制数据,但事实并非如此。现在我将粘贴我用于显示的控制器,实体和JSP代码。

控制器:

 @RequestMapping(value = "/product/{id}/image")
    public byte[] retrieveimage(@ModelAttribute("product") ProductBasic productBasic,@PathVariable("id")Integer id){
        User user = userService.getCurrentlyAuthenticatedUser();
        ProductBasic productBasic1 = productBasicService.getProductById(id);
        BASE64Encoder base64Encoder = new BASE64Encoder();
        byte[] data =  org.apache.commons.codec.binary.Base64.decodeBase64(productBasic1.getProductimage());
        return data;

    }

@RequestMapping(value="/product/show",method= RequestMethod.GET)
    public String listProducts(@ModelAttribute("product") ProductBasic productBasic,Model model){
        User user = userService.getCurrentlyAuthenticatedUser();
        model.addAttribute("product", new ProductBasic());
        model.addAttribute("listProducts",this.productBasicService.listProduct(user));
       BASE64Encoder base64Encoder = new BASE64Encoder();

        if(productBasic.getProductimage()==null){
            System.out.println("getProductImage is null"); // This is always returning null when I check
            return "product";
        }else {
            String image = "data:image/png;base64," + base64Encoder.encode(productBasic.getProductimage());
            model.addAttribute("saveimage", image);
            return "product";
        }
    }

JSP:

<h3>Product List</h3>
<c:if test="${!empty listProducts}">
    <table class="tg">
        <tr>
            <th width="80">Product ID</th>
            <th width="80">Product image</th>
            <th width="120">Product name</th>
            <th width="120">Product description</th>
            <th width="120">Product condition</th>
            <th width="120">Product age</th>
            <th width="120">Product EAN</th>
            <th width="120">Product ISBN</th>
            <th width="120">Product ordernumber</th>
            <th width="120">Product owners id</th>

            <th width="60">Edit</th>
            <th width="60">Delete</th>
        </tr>

        <c:forEach items="${listProducts}" var="product">
            <tr>
                <td>${product.productid}</td>
                <td>${product.productimage} </td>
                <td>${product.productname}</td>
                <td>${product.productdescription}</td>
                <td>${product.productcondition}</td>
                <td>${product.productage}</td>
                <td>${product.productean}</td>
                <td>${product.productisbn}</td>
                <td>${product.ordernumber}</td>
                <td>${product.user1id}</td>
                <img src="${product.productimage}" height="100" width="100"/>
                <td><a href="<c:url value='/editproduct/${product.productid}' />" >Edit Product</a></td>
                <td><a href="<c:url value='/removeproduct/${product.productid}' />" >Delete Product</a></td>
            </tr>
            <%--<img src="${saveimage}" height="100" width="100">--%>
        </c:forEach>


    </table>
</c:if>

实体:

@Entity
@Table(name = "product")
public class ProductBasic {

@Column(name = "productimage")
    byte[] productimage;
}



public byte[] getProductimage() {
        return productimage;
    }

public void setProductimage(byte[] productimage) {
    this.productimage = productimage;
}

DAOImpl:

 @Override
    public List<byte[]> listImage(User user){
        int id = user.getId();
        if(session == null){
            session = this.sessionFactory.openSession();
        } else{
            session = this.sessionFactory.getCurrentSession();
        }
        Query query = session.createQuery("from ProductBasic as p where p.user1.id=:id order by p.ordernumber");
        query.setParameter("id",id);
        List<ProductBasic> productBasicList= query.list();
        List<byte[]> images=null;
        if(productBasicList.isEmpty()){
            return null;
        } else {
            for (ProductBasic productBasic : productBasicList) {
                images.add(productBasic.getProductimage());  // Here there is nullPointer Exception
            }
            return images;
        }
    }
}

@Shazin:

将图像保存在服务中,如下所示:

 @Override
    @Transactional
    public void addProduct(User user, ProductBasic p){
        p.setProductimage(org.apache.commons.codec.binary.Base64.decodeBase64(p.getProductimage()));
        this.productBasicDAO.addProduct(user, p);
    }

用于productImage的实体中的Getter是:

 public byte[] getProductimage() {
        return productimage;
    }

    public void setProductimage(byte[] productimage) {

        this.productimage = productimage;
    }

当我点击firefox中的视图图像时,出现以下错误:

java.lang.IllegalArgumentException: Unknown return value type [[B]
    org.springframework.util.Assert.notNull(Assert.java:112)
    org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:70)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)

2 个答案:

答案 0 :(得分:0)

HTML img标记不适用于二进制字节数据。它有一个src属性,它接受一个URL,它使用一个单独的GET请求来检索图像二进制字节数据。

您可以做的是使用Controller方法返回二进制字节数据,如

/product/{id}/image

,当提供{id}时必须返回二进制字节数据。

使用此功能,您可以更改代码,如下所示

产品清单

                          产品编号             产品图片             产品名称             产品描述             产品状况             产品年龄             产品EAN             产品ISBN             产品订单号             产品所有者ID

        <th width="60">Edit</th>
        <th width="60">Delete</th>
    </tr>

    <c:forEach items="${listProducts}" var="product">
        <tr>
            <td>${product.productid}</td>
            <td>${product.productimage} </td>
            <td>${product.productname}</td>
            <td>${product.productdescription}</td>
            <td>${product.productcondition}</td>
            <td>${product.productage}</td>
            <td>${product.productean}</td>
            <td>${product.productisbn}</td>
            <td>${product.ordernumber}</td>
            <td>${product.user1id}</td>
            <!-- This Changed -->
            <img src="/product/${product.productid}/image" height="100" width="100"/>
            <td><a href="<c:url value='/editproduct/${product.productid}' />" >Edit Product</a></td>
            <td><a href="<c:url value='/removeproduct/${product.productid}' />" >Delete Product</a></td>
        </tr>
        <%--<img src="${saveimage}" height="100" width="100">--%>
    </c:forEach>


</table>

答案 1 :(得分:0)

我认为我们应该从$ {product.productimage}而不是二进制数据中获取图像的网址。 所以Product的属性“productimage”可以是字符串类型。我们可以在DB中存储一个URL,例如“/xxx/xxx.Jpg”