由于GAE的限制,我放弃了实施自己的QR发生器。以前的Google Charts API服务仍然可以使用,也可以使用ZXing的servlet进行复制。有关详细信息,请参阅此link。谢谢你的答案。
所以我挖掘了ZXing的源代码,他们似乎在所有进程中都使用了BufferedImage。我现在的问题可以表达为:
以下行显然会导致错误:
MatrixToImageWriter.writeToStream(encoded, "png", outs);
似乎正在使用BufferedImage。是否可以在不执行此步骤的情况下将BitMatrix转换为byte []?
我正在尝试在Google App Engine上创建一个servlet,以返回包含给定参数的QR代码。到目前为止,我已经创建了QRGen和ZXing的解决方案,这些解决方案在App Engine 本地开发模式下进行测试时非常有效。我的问题是,在将我的servlet部署到App Engine后,这两个实现都失败了,并说
无法初始化课程 com.google.apphosting.runtime.security.shared.stub.java.awt.image.BufferedImage
或
java.awt.Image是一个受限制的类。请参阅Google App Engine 开发人员指南了解更多详情。
我完全不明白这些工具是如何在内部工作的,我知道java.awt.image类不在Class whitelist上。我的问题是有没有办法解决这个安全功能,并实际从servlet返回一个二维码。这是我的最新实现(在开发模式下工作正常,但在部署的servlet上也失败)使用ZXing(它似乎提供了比QRGen更多的选项):
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
String returnString = "myString";
Writer writer = new QRCodeWriter();
BitMatrix encoded = null;
try
{
encoded = writer.encode(returnString, BarcodeFormat.QR_CODE, 300, 300);
}
catch (WriterException ex)
{
Logger.getLogger(QRService.class.getName()).log(Level.SEVERE, null, ex);
}
ByteArrayOutputStream outs = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(encoded, "png", outs);
byte[] out = outs.toByteArray();
Blob qrImage = new Blob(out);
resp.setContentType("image/jpeg");
resp.getOutputStream().write(qrImage.getBytes());
}
答案 0 :(得分:3)
此处,请查看Google Charts API
https://developers.google.com/chart/infographics/docs/qr_codes
它似乎允许您使用简单的HTTP GET请求创建QR代码。要在App Engine中创建HTTP GET请求,请尝试以下操作: