- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 dropwizard 资源中实现一个方法,该方法将为来自 JS 前端(使用数据表)的调用提供服务。
请求的查询参数如下所示:
columns[0][data]=0&columns[0][name]=&columns[0][searchable]=false&columns[0][orderable]=false&columns[0][search][value]=&columns[0][search][regex]=false
columns[1][data]=iata&columns[1][name]=iata&columns[1][searchable]=true&columns[1][orderable]=true&columns[1][search][value]=&columns[1][search][regex]=false
请求来自使用 DataTables 实现的 JS 前端,并使用服务器端处理。有关数据表如何在此处发送请求的信息:
https://datatables.net/manual/server-side
我在为上述查询参数定义数据类型时遇到问题。使用 spring 数据,我们可以将其定义为:
List<Map<String, String>> columns
它可以包装在一个用 ModelAttribute 注释的对象中,它会很好地反序列化。
在我的应用程序中,我使用的是旧版本的 dropwizard,它依赖于 jersey 1.19。我尝试将其注释为 QueryParam,但应用程序在启动时失败。
方法:
@Path("/mappings")
@GET
@Timed
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response getMappings(@QueryParam("columns") List<Map<String, String>> columns) {
// processing here.
}
当我这样做时,我得到:
ERROR [2016-11-07 14:16:13,061] com.sun.jersey.spi.inject.Errors: The following errors and warnings have been detected with resource and/or provider classes: SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.ean.gds.proxy.ams.application.resource.gui.IataMappingGuiResource.getMappings(java.util.List) at parameter at index 0 WARN [2016-11-07 14:16:13,070] /: unavailable
我的问题是:除了为它编写自定义反序列化器之外,我还有其他选择吗?
注意:如果我使用@Context 抓取请求,我可以看到 decodedQueryParams 是一个 MultivaluedMap,它将像“columns[0][data]”这样的字符串键映射到字符串值列表,它始终只有一个元素,这就是值(value)。
更新:经过一番挖掘,我发现了以下 JAX-RS 规范(第 3.2 节),它解释了为什么我的方法一开始就无效:
The following types are supported:
Primitive Types
Types that have a constructor that accepts a single String argument.
Types that have a static method named valueOf with a single String argument.
List, Set, or SortedSet where T satisfies 2 or 3 above.
来源:Handling Multiple Query Parameters in Jersey
所以我尝试只使用一个列表。这不会在启动时使应用程序崩溃,但是当请求进入时,它会反序列化为一个空列表。因此,问题仍然是哪种方法是正确的。
最佳答案
事实上,您使用的结构与我们为完善 Rest Web 服务而映射的所有常见结构截然不同。此外,由于这种结构合规性问题,一旦我们没有传输基于对象的参数,尝试使用 JSON 来编码/解码值将不适合。
但是,我们有几个选项可以“解决这种情况”。让我们看看:
使用@QueryParam
策略是不可能的,主要有两个原因:
Lists
、Sets
等,它在 Collection
方面的使用存在一些限制;&
分隔)具有相同的名称.当我们考虑提交(通过 GET
)复选框值列表的表单时,这会更容易:一旦它们都具有相同的 name
属性,它们将在 "name=value1&name=value2"
格式。因此,为了满足此要求,您必须执行以下操作:
@GET
public Response getMappings(@QueryParam("columns") List<String> columns) {
return Response.status(200).entity(columns).build();
}
// URL to be called (with same param names):
// /mappings?columns=columns[1][name]=0&columns=columns[0][searchable]=false
// Result: [columns[1][name]=0, columns[0][searchable]=false]
您也可以尝试为参数注释创建一个自定义 Java 类型,就像您一样see here .这将避免编码问题,但在我的测试中它不适用于括号问题。 :(
您可以使用正则表达式和 @Path
注释来定义 String
参数将接受的内容。不幸的是,您的 URL 将由无效字符组成(例如方括号 []
),这意味着您的服务器将返回 500 错误
。
另一种方法是,如果您将此字符“替换”为有效字符(例如下划线字符):
/mappings/columns_1_=0&columns_1__name_=
这样,就可以毫无顾虑地应用解决方案了:
@GET
@Path("/{columns: .*}")
public Response getMappings(@PathParam("columns") String columns) {
return Response.status(200).entity(columns).build();
}
// Result: columns_1_=0&columns_1__name_=
一个更好的方法是通过 UriInfo
对象,正如您可能已经尝试过的那样。这更简单,因为不需要更改 URL 和参数。该对象有一个 getQueryParameters()
,它返回一个带有参数值的 Map
:
@GET
public Response getMappings(@Context UriInfo uriInfo) {
MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
// In case you want to get the whole generated string
String query = uriInfo.getRequestUri().getQuery();
String output = "QueryParams: " + queryParams
+ "<br> Keys: " + queryParams.keySet()
+ "<br> Values: " + queryParams.values()
+ "<br> Query: " + query;
return Response.status(200).entity(output).build();
}
// URL: /mappings?columns[1][name]=0&columns[0][searchable]=false
/* Result:
* QueryParams: {columns[0][searchable]=[false], columns[1][name]=[0]}
* Keys: [columns[0][searchable], columns[1][name]]
* Values: [[false], [0]]
* Query: columns[1][name]=0&columns[0][searchable]=false
*/
但是,您必须知道,如果您遵循这种方法(使用 Map
),一旦结构不支持,就不能有重复的键。这就是为什么我包含 getQuery()
选项,您可以在其中获取整个字符串。
InjectableProvider
,但我看不到 getQuery()
策略的许多差异(因为您可以拆分它并创建您自己的值映射)。关于java - 反序列化 List<Map<String, String>> jersey 1 中的 QueryParam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40467474/
我使用 vuejs-axios 从客户端获取数据并将其发布到服务器端。在服务器端,我使用了 java,而我使用 SparkJAVA 框架来处理请求响应。下面提到的代码块是我用来将表单数据从 vuejs
您好,使用多路由构建 Angular 应用。 导航到页面 > queryParams 触发订阅。 当我在页面中时,我需要更改页面内的 queryParams 但不会再次触发订阅功能。 (因为我不想再次
我正在寻找在 Spring 中使用 @QueryParam 的简单示例。我的想法是有一个像这样的链接,它将获取 id 值,运行我的 java 类并显示返回的字符串。我的问题是没有找到返回值。 http
我有以下格式从浏览器发送的查询参数 sort[0][field]:prodId sort[0][dir]:asc 如何使用@QueryParam在服务器中检索上述参数? 从 Chrome 控制台 ta
我正在创建一个端点(使用 Jersey 注释),该端点接收字符串列表作为参数。字符串需要包含一个键和一个值。所以在 url 上它看起来像 ?params=key1=value1¶ms=key2
我正在尝试从 REST Web 服务的 URL 请求中获取请求参数。 @Path 能够映射方法。但 QueryParam 无法从查询参数中获取值。 我的请求网址是 192.168.20.147:808
我必须从客户端 java 类调用一个 Restful Web 服务。 我需要传递 HashMap、String,它必须返回一个 bean 列表。我正在使用 Jersey Restful 网络服务 我的
我正在使用 Jersey for Rest 并有一个接受 @QueryParam. 的方法 但是,用户可以像这样发送@QueryParam.: contractName# 其中 # 是 0-155 之
这是函数头 @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Path("/getxyz") pub
我正在尝试更新(添加、删除)组件中的 queryParams。在 angularJS 中,它曾经是可能的,这要归功于: $location.search('f', 'filters[]'); // s
我有一个 Express 服务器,并且在我的路由中配置了: app.use(express.urlencoded({ extended: false })); 在前端,我使用 Angular 发送请求
给出以下代码: newtype HelloMessage = HelloMessage { msg :: String } deriving (Generic) instance ToJSON H
我有一个 RESTful 服务。这需要两个参数:开始日期和结束日期。 如果我使用 @RequestParam 注释,我就会得到我需要的东西。但如果我使用 @QueryParam,我注意到即使传递它,它
有没有办法在不使用 @QueryParam 注释显式声明其名称的情况下获取任何查询参数? 我有一个字符串,其中可能包含诸如 {animal} 之类的标记,然后将其替换为发布的查询参数,例如?anima
当我在 JAX-RS 中添加字符串的默认值时,它不会获取该值。它保持为 null 或空。 @QueryParam("status") private String status = "confirme
例如,我有课 class MyQuery { Date start; Date end; ChronoUnit scale; // ChronoUnit is enum } 我想声明
对于以下示例(使用 Jersey 2.6),百分比编码的查询参数未解码,相反,+ 被空格替换。 @Path("test") public class TestResource { @Path(
我目前正在尝试了解如何在 Angular 组件中收集 queryParameters。因为我只想在初始化期间收集它们一次,所以我首先尝试了快照模式: ngOnInit() { console.
我想在我的应用程序中提供一个基于来自 url 的 QueryParam 的常量。 localhost:4200?flag=true 在我添加的模块提供者中 { provide: FLAG, useFa
我正在尝试使用 Angular 2.0 捕获查询字符串参数,但遇到了困难。我有一个这样的网址 http://localhost:5000/?id_token=eyJ0eXAiO .... 而且我希望能
我是一名优秀的程序员,十分优秀!