使用 dropwizard 时对 BLOB 的 base64 编码感到困惑

confused about base64 encoding of BLOBs when using dropwizard

我有一个针对 postgres 的 dropwizard 应用 运行 和一个 table。我将实体 class 中的 BLOB 列定义为 byte[]:

@Entity
@Table(name = "document")
@NamedQueries({
        @NamedQuery(
                name = "my.documents.model.Document.findAll",
                query = "SELECT d FROM Document d"
        )
})
public class Document {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "documentName", nullable = false)
    private String documentName;

    @Column(name = "documentData")
    private byte[] documentData;    
    ...
 }

当我使用 curl 或邮递员测试 POST API 时,我首先使用 base64 对 BLOB 数据字符串 ("my mlob data") 进行编码。请注意,它不会让我在没有编码的情况下提交:

{"documentName":"Invoice1","documentData":"bXkgYmxvYiBkYXRhCg=="}

在 API 中,我希望必须手动解码字节,但没有,它似乎已经被解码了。下面的代码片段打印 "my blob data".

@Path("/documents")
@Produces(MediaType.APPLICATION_JSON)
public class DocumentsResource {

    @POST
    @UnitOfWork
    public Document createDocument(Document document) {
        byte[] data = document.getDocumentData();
         System.out.println("new String(data));
        }
        ...
    }
    ...
}

但是,当我使用 java 服务器端客户端测试 API 并使用 Base64 编码时,它仍然会在 API 端以编码形式出现:

Client client;
Document document;
String s = new String("my blob data");
document.setdocumentData(Base64.encode(s.getBytes());

client.target(myurl).request()
  .post(Entity.entity(document, MediaType.APPLICATION_JSON_TYPE));

当我发送普通的、未编码的字符串(或二进制)时,它在接收 API 端是正确的。

我不明白:

Jackson 使用 base64 编码器序列化和反序列化 byte[] 个字段 automatically

你的错误是在 Jackson 之前手动对其进行了 base64 编码,这意味着它在 JSON 上进行了两次 base64 编码。

你应该改变

document.setdocumentData(Base64.encode(s.getBytes()));

document.setdocumentData(s.getBytes());