【问题标题】:Displaying images stored in Mysql database as Blob using Rest Services, Java and Angular JS使用 Rest Services、Java 和 Angular JS 将存储在 Mysql 数据库中的图像显示为 Blob
【发布时间】:2015-01-10 23:53:41
【问题描述】:

我正在构建一个使用 AngularJS 作为前端的 Web 应用程序。我正在使用 Rest 服务来调用后端并在 Jboss Wildfly 中部署应用程序。该应用程序连接到我有一个表产品的 Mysql 数据库。 一个产品包含一个 id 和一个存储为 BLOB 的图像。 Product java实体如下:

@Entity
@Table(name = "PRODUCTS")
public class Product implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;

@Column(name = "IMAGE", nullable = false, insertable = true, updatable = true)
private Blob image;

@Column(name="PRICE",nullable=false, insertable=true,updatable=true)
private Long price;

GETTERS AND SETTERS......
}

然后是Rest Service的代码:

@Path("/products")
public class ProductsService extends CommonService{

private static final Logger log =  Logger.getLogger(ProductsService.class);


@EJB
private ProductsServiceHandler handler;

@GET
public Response getAllProducts(@Context Request request, @Context HttpHeaders httpHeaders)
{
    try
    {
        List<Product> products=handler.findAllProducts();
        return Response.ok(products).header(ALLOW_ORIGIN_HEADER, "*").build();
    }
    catch(Exception e){return Response.status(Status.INTERNAL_SERVER_ERROR).build();}
}

产品从数据库中正确检索,图像存储为 Blob,但是当我尝试发送响应时,我收到以下错误:

原因:com.fasterxml.jackson.databind.JsonMappingException:找不到类 java 的序列化程序。 io.ByteArrayInputStream 并且没有发现创建 BeanSerializer 的属性(为避免异常,请禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过参考链:java.util.ArrayList[0]->com.fgonzalez.domainmodel.Product["image"]-> $Proxy70["binaryStream"])

我猜是因为它不知道如何序列化 Blob。我注意到如果我只将图像作为 InputStream 发送它不会抱怨(但现在我必须弄清楚如何在 Html 中显示它)。知道如何实现我的需要吗?

提前非常感谢你!

【问题讨论】:

    标签: java angularjs rest jackson resteasy


    【解决方案1】:

    您遇到的问题是 Blob 本质上是 InputStream,而不是图像的字节 - 您必须读取 InputStream 才能获取图像字节。

    如果你解决了这个问题,你可以通过 base-64 编码或其他方式传输二进制图像数据,但是你会在客户端遇到问题,试图弄清楚如何显示它。

    如果可以的话,我会改变两点:

    1. 在数据库中只存储图像的名称,将实际图像存储在磁盘上。

    2. 在JSon响应中,只发送图片的名字——然后在客户端使用普通的HTML结构来显示图片——让浏览器单独向服务器请求图片。

      李>

    【讨论】:

    • 天哪,我也会遇到同样的问题... fgonzalez,你有没有办法从数据库而不是磁盘中显示这些图像?
    • 没关系。我通过调用包含每个图像的 id 的 url 很容易地解决了这个问题。控制器将返回一个字节数组。问题已解决;) 根本不需要通过 angularjs。 (我正在使用 Spring MVC)
    猜你喜欢
    • 2014-01-05
    • 2014-08-05
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2011-07-28
    • 2017-08-19
    相关资源
    最近更新 更多