使用 webtarget 从客户端调用 rest 请求。但是剩余资源的参数没有映射到客户端模型 class 参数
Invoking rest request from client using webtarget. But paramter of rest resource not getting mapped to client model class parameter
我正在使用 Jersey 2.0 通过 JAX-RS 客户端调用休息请求
User request = new User("1","ABC");
webTarget = client.target(strRestURL).path("Users");
Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_XML);
Response setUserResponse = invocationBuilder.post(Entity.entity(request, MediaType.APPLICATION_XML));
String resp = setUserResponse.readEntity(String.class);
客户端的模型class如下:
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "request")
public class User {
private static final long serialVersionUID = 1L;
private String id;
private String Name;
public String getId() {
return id;
}
public void setId(String id) {
this.id= id;
}
public String getName() {
return Name;
}
public void setName(String name) {
this.Name= name;
}
}
其余 WS 实现是:
@POST
@Path("/User")
@Consumes({MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_XML})
public HSServiceResponse setUsers(final User model, @Context HttpServletRequest request) throws IllegalArgumentException, IllegalAccessException {
资源用户服务器端:
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "request")
@XmlAccessorType(XmlAccessType.NONE)
public class User {
private static final long serialVersionUID = 1L;
@XmlElement
private String id;
@XmlElement
private String Name;
public String getId() {
return id;
}
public void setId(String id) {
this.id= id;
}
public String getName() {
return Name;
}
public void setName(String name) {
this.Name= name;
}
}
此处,服务器端资源 class 的 Name
属性在收到 post 请求时收到的值为 null
。但是 id
参数已正确映射。
如果我在资源 class 服务器端实现中将参数 Name
更改为 name
。它会完美地工作。但是我的要求是将 rest 参数保留为仅名称("N" 大写)而不是名称("n" 小)。
如何实现从 Jersey 客户端发送请求到地图 Name
以及 id
。
感谢任何帮助!
使用 @XmlElement
注释的 name
属性。
class UserServer {
@XmlElement(name="Name")
private String name;
}
这让您可以更改 XML 元素名称,而不必在 Java 代码中求助于时髦的变量名称。
更新
对于客户端的User
,XML元素的名字是通过Java bean 属性获取的,也就是getName
, 删除 get
并将第一个字母小写。这就是 JavaBean 约定的工作原理。如果你想改变这个,那么你应该在 getName()
方法
上添加 @XmlElement(name="Name")
class UserClient {
@XmlElement(name="Name")
public String getName() {
return this.name;
}
}
我正在使用 Jersey 2.0 通过 JAX-RS 客户端调用休息请求
User request = new User("1","ABC");
webTarget = client.target(strRestURL).path("Users");
Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_XML);
Response setUserResponse = invocationBuilder.post(Entity.entity(request, MediaType.APPLICATION_XML));
String resp = setUserResponse.readEntity(String.class);
客户端的模型class如下:
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "request")
public class User {
private static final long serialVersionUID = 1L;
private String id;
private String Name;
public String getId() {
return id;
}
public void setId(String id) {
this.id= id;
}
public String getName() {
return Name;
}
public void setName(String name) {
this.Name= name;
}
}
其余 WS 实现是:
@POST
@Path("/User")
@Consumes({MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_XML})
public HSServiceResponse setUsers(final User model, @Context HttpServletRequest request) throws IllegalArgumentException, IllegalAccessException {
资源用户服务器端:
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "request")
@XmlAccessorType(XmlAccessType.NONE)
public class User {
private static final long serialVersionUID = 1L;
@XmlElement
private String id;
@XmlElement
private String Name;
public String getId() {
return id;
}
public void setId(String id) {
this.id= id;
}
public String getName() {
return Name;
}
public void setName(String name) {
this.Name= name;
}
}
此处,服务器端资源 class 的 Name
属性在收到 post 请求时收到的值为 null
。但是 id
参数已正确映射。
如果我在资源 class 服务器端实现中将参数 Name
更改为 name
。它会完美地工作。但是我的要求是将 rest 参数保留为仅名称("N" 大写)而不是名称("n" 小)。
如何实现从 Jersey 客户端发送请求到地图 Name
以及 id
。
感谢任何帮助!
使用 @XmlElement
注释的 name
属性。
class UserServer {
@XmlElement(name="Name")
private String name;
}
这让您可以更改 XML 元素名称,而不必在 Java 代码中求助于时髦的变量名称。
更新
对于客户端的User
,XML元素的名字是通过Java bean 属性获取的,也就是getName
, 删除 get
并将第一个字母小写。这就是 JavaBean 约定的工作原理。如果你想改变这个,那么你应该在 getName()
方法
@XmlElement(name="Name")
class UserClient {
@XmlElement(name="Name")
public String getName() {
return this.name;
}
}