Spring MVC表blob字段为json

时间:2018-01-23 09:50:45

标签: java json spring-mvc blob

我在数据库表中有一个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?

1 个答案:

答案 0 :(得分:1)

在这种情况下,可以使用<64> Base 64 Representation。将您的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 ;
    }