我在数据库表中有一个 blob 字段。它包含特定信息。我需要将该字段中的数据作为 json 传递给 Rest。 Rest 使用 Spring MVC。
@RequestMapping (value = "/blob", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application / json; charset = utf-8")
为了传输 blob,我想出了一个到 String 的转换,来自 String 的客户端将再次获取 byte [] 并读取它。
这是我的查询和设置转换器。
Query <?> Q = session.createNativeQuery (sql);
q.setReadOnly (true);
q.setResultTransformer (BasicTransformerAdapterBlob.INSTANCE);
list = q.getResultList ();
转换类代码
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.compress.utils.IOUtils;
import org.hibernate.transform.BasicTransformerAdapter;
public class BasicTransformerAdapterBlob extends BasicTransformerAdapter {
private static final long serialVersionUID = 1L;
public final static BasicTransformerAdapterBlob INSTANCE;
static {
INSTANCE = new BasicTransformerAdapterBlob();
}
private BasicTransformerAdapterBlob() {
}
@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 0; i < aliases.length; i++) {
Object t = tuple[i];
if (t != null && t instanceof Blob) {
Blob b = (Blob) tuple[i];
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
IOUtils.copy(b.getBinaryStream(), bos);
t = new String(bos.toByteArray(),"UTF-8");
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
map.put(aliases[i], t);
}
return map;
}
}
结果,我得到了 Json
[ {
"LINE_ID" : 1,
"LINE_NAME" : "My line",
"COORDS" : "\u0000\u0000\u0000\u0000ЂЋ\tA\u0000\u0000\u0000\u0000 Pе@\u0000\u0000\u0000\u0000ИЌ\tA\u0000\u0000\u0000\u0000@Mе@\u0000\u0000\u0000\u0000`Ќ\tA\u0000\u0000\u0000\u0000`Iе@\u0000\u0000\u0000\u0000pЊ\tA\u0000\u0000\u0000\u0000аDе@\u0000\u0000\u0000\u0000ё‹\tA\u0000\u0000\u0000\u0000`?е@\u0000\u0000\u0000\u0000�Љ\tA\u0000\u0000\u0000\u0000@8е@\u0000\u0000\u0000\u0000А‰\tA\u0000\u0000\u0000\u0000а1е@\u0000\u0000\u0000\u0000\b‰\tA\u0000\u0000\u0000\u0000\u0000,е@\u0000\u0000\u0000\u0000\u0018€\tA\u0000\u0000\u0000\u0000А%е@\u0000\u0000\u0000\u0000Ђ‡\tA\u0000\u0000\u0000\u0000\u0000\u001Fе@\u0000\u0000\u0000\u0000А†\tA\u0000\u0000\u0000\u0000А\u0018е@\u0000\u0000\u0000\u0000\b†\tA\u0000\u0000\u0000\u0000Ђ\u000Fе@\u0000\u0000\u0000\u0000p…\tA\u0000\u0000\u0000\u0000Ђ\u0007е@\u0000\u0000\u0000\u00008…\tA\u0000\u0000\u0000\u0000 \u0002е@\u0000\u0000\u0000\u0000и„\tA\u0000\u0000\u0000\u0000Ђэд@\u0000\u0000\u0000\u0000ё„\tA\u0000\u0000\u0000\u0000ашд@\u0000\u0000\u0000\u0000р„\tA\u0000\u0000\u0000\u0000`сд@\u0000\u0000\u0000\u0000x…\tA\u0000\u0000\u0000\u0000\u0000лд@\u0000\u0000\u0000\u0000Ё…\tA\u0000\u0000\u0000\u0000 ед@\u0000\u0000\u0000\u0000\u0018†\tA\u0000\u0000\u0000\u0000 ад@\u0000\u0000\u0000\u0000 †\tA\u0000\u0000\u0000\u0000АЪд@\u0000\u0000\u0000\u0000@‡\tA\u0000\u0000\u0000\u0000\u0000Фд@\u0000\u0000\u0000\u0000ш‡\tA\u0000\u0000\u0000\u0000 Од@\u0000\u0000\u0000\u0000 ‰\tA\u0000\u0000\u0000\u0000 Жд@\u0000\u0000\u0000\u0000ЂЉ\tA\u0000\u0000\u0000\u0000 їд@\u0000\u0000\u0000\u0000 ‹\tA\u0000\u0000\u0000\u0000А№д@\u0000\u0000\u0000\u0000\u0000Ќ\tA\u0000\u0000\u0000\u0000Ђід@\u0000\u0000\u0000\u0000 Ћ\tA\u0000\u0000\u0000\u0000\u0000®д@\u0000\u0000\u0000\u0000ЂЏ\tA\u0000\u0000\u0000\u0000\u0000©д@\u0000\u0000\u0000\u0000Ёђ\tA\u0000\u0000\u0000\u0000\u0000¤д@\u0000\u0000\u0000\u0000и‘\tA\u0000\u0000\u0000\u0000@ д@\u0000\u0000\u0000\u0000x“\tA\u0000\u0000\u0000\u0000аљд@\u0000\u0000\u0000\u0000\b•\tA\u0000\u0000\u0000\u0000`•д@\u0000\u0000\u0000\u0000°–\tA\u0000\u0000\u0000\u0000Ађд@\u0000\u0000\u0000\u0000x�\tA\u0000\u0000\u0000\u0000\u0000‹д@\u0000\u0000\u0000\u0000Ёљ\tA\u0000\u0000\u0000\u0000А„д@\u0000\u0000\u0000\u0000pњ\tA\u0000\u0000\u0000\u0000@д@\u0000\u0000\u0000\u0000Иќ\tA\u0000\u0000\u0000\u0000Ђ{д@\u0000\u0000\u0000\u0000pџ\tA\u0000\u0000\u0000\u0000\u0000wд@\u0000\u0000\u0000\u0000\u0000Ў\tA\u0000\u0000\u0000\u0000`rд@\u0000\u0000\u0000\u0000рЎ\tA\u0000\u0000\u0000\u0000аoд@\u0000\u0000\u0000\u0000аў\tA\u0000\u0000\u0000\u0000\u0000mд@"
} ]
结果发现有些字符是作为�传输的,客户端无法解密。
如何解决这个问题?
还有什么其他机制可以将 blob 字段转换为 json?
最佳答案
在这种情况下可以使用 Base 64 表示法。将 BLOB
数据转换为 Base64 字符串,然后传递给客户端。任何客户端都可以轻松解码并使用。
如果您使用的是Java 8,那么您就有 Base64类可直接放入包中:
import java.util.Base64;
编码为 Base64 的代码将更改为:
public String encodeBase64(byte [] encodeMe){
byte[] encodedBytes = Base64.getEncoder().encode(encodeMe);
return new String(encodedBytes) ;
}
同样,您的新解码将更改为
public byte[]decodeBase64(String encodedData){
byte[] decodedBytes = Base64.getDecoder().decode(encodedData.getBytes());
return decodedBytes ;
}
关于java - Spring MVC 表 blob 字段转 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48398673/