我在数据库表中有一个blob字段。它包含特定信息。我需要将此字段中的数据传递给Rest作为json。 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?
答案 0 :(得分:1)
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 ;
}