java - Spring MVC 表 blob 字段转 json

标签 java json spring-mvc blob

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

相关文章:

java - 使用 json-smart 读取 JSON 文件

java - spring boot RequestBody 不起作用

java - Spring MVC Java多线程: perform an SQL statement in the background

java - 无法使用父类中的变量?

java - 等于方法无法正常工作[已解决]

Java 文件 URI 错误?

java - Spark Streaming 中状态函数的问题

sql - 将 JSON 结果连接到单列 postgresql

java - 为什么我在响应 JSON 请求时收到 500 错误?

android - 如何将 MappingJacksonHttpMessageConverter 的内容类型从 application/json;charset=UTF-8 更改为 application/json