使用 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 端是正确的。
我不明白:
为什么当我通过 curl 或 postman
调用 API 时数据被神奇地解码
为什么 API 在通过 java 代码调用时无需编码就可以工作。
Jackson 使用 base64 编码器序列化和反序列化 byte[]
个字段 automatically。
你的错误是在 Jackson 之前手动对其进行了 base64 编码,这意味着它在 JSON 上进行了两次 base64 编码。
你应该改变
document.setdocumentData(Base64.encode(s.getBytes()));
到
document.setdocumentData(s.getBytes());
我有一个针对 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 端是正确的。
我不明白:
为什么当我通过 curl 或 postman
调用 API 时数据被神奇地解码
为什么 API 在通过 java 代码调用时无需编码就可以工作。
Jackson 使用 base64 编码器序列化和反序列化 byte[]
个字段 automatically。
你的错误是在 Jackson 之前手动对其进行了 base64 编码,这意味着它在 JSON 上进行了两次 base64 编码。
你应该改变
document.setdocumentData(Base64.encode(s.getBytes()));
到
document.setdocumentData(s.getBytes());