【发布时间】:2014-03-11 11:16:05
【问题描述】:
Java 6接口MultivaluedMap有什么用?
【问题讨论】:
-
他在询问使用这种功能的场景。
-
我可以看到它很少使用,我对用例感兴趣?
标签: java data-structures jax-rs java-6
Java 6接口MultivaluedMap有什么用?
【问题讨论】:
标签: java data-structures jax-rs java-6
接口不属于“Java”,这意味着该接口不是核心库的一部分。它是javax.ws.rs 层次结构的一部分,它是JAX-RS 规范的一部分。它由实现规范的框架使用,例如Jersey。每当地图不仅应该引用单个值,而且应该引用任意数量的值时,都会使用它。一个使用示例是请求标头的存储,您可能希望在其中为每个键添加多个值。或者在某些情况下甚至没有键,与null 值相比,处理空列表更容易。
以这个 HTTP-header 为例:
Accept-Encoding: compress;q=0.5, gzip;q=1.0
你可以这样建模
MultivaluedMap<String, String> map = ...
map.add("Accept-Encoding", "compress;q=0.5");
map.add("Accept-Encoding", "gzip;q=1.0");
在泽西岛内部。这种类型的多值存储是 Java 中的常见问题,其他映射实现者(例如 Guava)已解决此问题。
这基本上是 javadoc 所说的:
键值对的映射。每个键可以有零个或多个值。
【讨论】:
MultivaluedMap<String, String> map = new MultivaluedMapImpl();
它是一个键值对的映射。每个键可以有零个或多个值
public interface MultivaluedMap<K,V> extends java.util.Map<K,java.util.List<V>>
【讨论】:
MultivaluedMap 的一个很好的用途是与 UriInfo 一起使用。如果您正在编写一个接收多个 QueryParam 的 REST 端点,则可以使用 UriInfo 获取所有参数并使用 getQuery() 调用提取它们。例如:
public void get(@Context UriInfo ui) {
MultivaluedMap params = ui.getRequestUri().getQuery();
// now do what you want with your params
}
MultivaluedMap 很有帮助,因为您可以有多个值的参数。例如,如果它是一个客户数据库并且您想要获得多个客户,那么您的地图将具有“customerID”键和与其相关联的多个值。
【讨论】:
MultiValuedMap 是javax.ws.rs.core 包的一部分,而不是Core Java。主要用于存储请求中的Headers值
private MediaType getMediaType(Class entityClass, Type entityType, MultivaluedMap<String, Object> headers) {
final Object mediaTypeHeader = headers.getFirst("Content-Type");
....
}
另外,UriInfo 也很有用
private String getJsonpFunctionName(){
UriInfo uriInfo = getUriInfo();
if (uriInfo == null) {
return null;
}
MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
if (queryParameters == null) {
return null;
}
return queryParameters.getFirst("jsonp");
}
【讨论】: