我需要扩展CXF用于检查二进制数据的内容类型,并遇到了这个答案:停止Apache CXF记录MultipartBody附件的二进制数据
但是,当我尝试实现isBinaryData()
方法的覆盖时:
@Override
public boolean isBinaryContent(String contentType) {
return contentType != null && BINARY_CONTENT_MEDIA_TYPES.contains(contentType) || "myContentType".equals(contentType);
}
访问BINARY_CONTENT_MEDIA_TYPES
时出现错误:
字段abstractloginginterceptor。BINARY_CONTENT_MEDIA_TYPES不是可见
在CXF实现中,该BINARY_CONTENT_MEDIA_TYPES
是通过静态块实现的,如开始时引用的问题所示。我只是简单地重新声明这个列表:
private static final List<String> BINARY_CONTENT_MEDIA_TYPES;
static {
BINARY_CONTENT_MEDIA_TYPES = new ArrayList<String>();
BINARY_CONTENT_MEDIA_TYPES.add("application/octet-stream");
BINARY_CONTENT_MEDIA_TYPES.add("image/png");
BINARY_CONTENT_MEDIA_TYPES.add("image/jpeg");
BINARY_CONTENT_MEDIA_TYPES.add("image/gif");
}
如果是这样的话,我可以在List中添加另一个具有我所需内容类型的条目。
BINARY_CONTENT_MEDIA_TYPES字段是私有的,不能从子类访问。链接问题中的答案可能来自CXF的早期版本,其中列表不是私有的。
正如您所说,您可以重新声明列表,其中也包含您的内容类型。您还可以将您的逻辑附加到父实现中的现有逻辑:
@Override
protected boolean isBinaryContent(String type)
{
return super.isBinaryContent(type) || "myContentType".equals(type);
}
如果CXF的未来版本更改了BINARY_CONTENT_MEDIA_TYPES列表,则该实现将自动继承这些更改。而如果列表是复制的,那么您必须手动更改实现。