用例
我有以下休息客户端
@RegisterRestClient(configKey = "service")
public interface Service {
@POST
@Path("Invoice")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
Response request(@QueryParam("instance") String instance, @BeanParam Input input);
}
Input
是一个POJO类,包括等属性
public class Input {
@FormParam("title")
public String title;
@FormParam("description")
public String description;
问题
对API的请求运行良好,但在我的情况下,属性的顺序确实很重要(这背后的原因,我目前无法回答,抱歉(。
因此,发送title=Test&description=Testdescription
与发送description=Testdescription&title=Test
是不同的。
我尝试过的其他解决方案
- 使用
Form
而不是POJO:不向服务器发送数据
@POST
@Path("Invoice")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
CustomResponse requestForm(@QueryParam("instance") String instance, @BeanParam Form form);
- 使用
Entit<Form>
:不向服务器发送数据
@POST
@Path("Invoice")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
CustomResponse requestForm(@QueryParam("instance") String instance, @BeanParam Entity<Form> form);
假设
我发现org.jboss.resteasy.client.jaxrs.internal.proxy.processors.FormProcessor
在内部使用HashMap
。我认为这正是问题所在,因为没有保证的订单。我的假设正确吗?
问题
我如何解决这一问题,并始终使用Microprofile Rest客户端为API提供相同的订单。
变通办法
它与类似的org.jboss.resteasy.client.jaxrs.ResteasyClient
调用一起工作
Response response = target
.request(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_FORM_URLENCODED)
.post(Entity.form(form));
它对我有效,请参阅:
@POST
@Path(value = "/auth/realms/{realm}")
@Consumes(APPLICATION_FORM_URLENCODED_VALUE)
AuthenticateResponse authenticate(@PathParam("realm") String realm, MultivaluedMap<String,?> params);
尝试使用MultivaluedMap