我正在构建一个使用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中显示它)。关于如何实现我所需要的任何想法?
提前非常感谢哟!
您遇到的问题是Blob本质上是一个InputStream,而不是图像的字节-您必须读取InputStream才能获取图像字节。
如果您解决了这一问题,则可以通过base-64编码或其他方式传输二进制图像数据,但是在客户端,试图弄清楚如何显示它会遇到问题。
相反,如果可以的话,我将更改两件事:
仅在数据库中存储映像的名称,将实际映像存储在磁盘上。
在JSon响应中,仅发送图像的名称-然后在客户端上使用常规的HTML结构显示图像-让浏览器单独从服务器请求图像。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句