我有一个针对postgres和一张桌子的dropwizard应用程序。我将实体类中的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数据字符串(“我的mlob数据”)进行编码。请注意,如果没有编码,它不会让我提交:
{"documentName":"Invoice1","documentData":"bXkgYmxvYiBkYXRhCg=="}
在API中,我希望必须手动解码字节,但是不,它似乎已经被解码了。下面的代码段显示“我的Blob数据”。
@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或邮递员调用API时,为什么数据会被神奇地解码
从Java代码调用API时,为什么API无需编码就可以工作。
Jacksonbyte[]
使用base64编码器自动对字段进行序列化和反序列化。
您的错误是base64在Jackson之前手动对其进行编码,这意味着它在JSON上对base64进行了两次编码。
你应该改变
document.setdocumentData(Base64.encode(s.getBytes()));
到
document.setdocumentData(s.getBytes());
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句