Jersey 2.0下如何为WebTarget.Builder的Put方法传递参数?
嘿,作为Jersey 2.0的新手,这个添加评论的需求其实不难,咱们一步步来,从服务端到客户端都给你安排得明明白白~
第一步:定义你的Resource模型类
首先得把资源实体类写好,要让Jersey能自动把它序列化成JSON(或者反序列化),记得加@XmlRootElement注解,还要留好无参构造函数(Jersey序列化必须要):
import javax.xml.bind.annotation.XmlRootElement; import java.util.List; @XmlRootElement // 让Jersey支持JSON序列化/反序列化 public class Resource { private String id; private String name; private List<String> comments; // 用List比数组更灵活,Jersey处理起来也更顺手 // 必须的无参构造函数 public Resource() {} // Getter & Setter方法 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; } public List<String> getComments() { return comments; } public void setComments(List<String> comments) { this.comments = comments; } }
第二步:编写REST服务端接口
接下来写处理评论添加的服务端点,这里模拟一个内存存储(实际项目换成数据库/DAO操作就行):
import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Consumes; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.HashMap; import java.util.List; import java.util.Map; @Path("/resourceupdate") public class ResourceUpdateResource { // 模拟数据库存储资源 private static Map<String, Resource> resourceStore = new HashMap<>(); // 初始化测试数据 static { Resource testResource = new Resource(); testResource.setId("1"); testResource.setName("测试资源"); testResource.setComments(List.of("第一条评论")); resourceStore.put("1", testResource); } @POST @Consumes(MediaType.APPLICATION_JSON) // 指定接收JSON请求体 @Produces(MediaType.APPLICATION_JSON) // 指定返回JSON响应 public Response addComment(Resource updatedResource) { // 1. 查找目标资源 Resource existingResource = resourceStore.get(updatedResource.getId()); if (existingResource == null) { return Response.status(Response.Status.NOT_FOUND) .entity("ID为" + updatedResource.getId() + "的资源不存在") .build(); } // 2. 添加新评论(这里假设客户端传的comments是新增的评论) if (updatedResource.getComments() != null && !updatedResource.getComments().isEmpty()) { existingResource.getComments().addAll(updatedResource.getComments()); } // 3. 返回更新后的资源 return Response.ok(existingResource).build(); } }
第三步:编写Jersey客户端代码
客户端需要依赖Jersey的客户端包和JSON处理包,先确保Maven依赖(如果用Maven的话):
<dependencies> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.41</version> <!-- 用最新稳定版即可 --> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.41</version> </dependency> </dependencies>
然后写客户端代码:
import org.glassfish.jersey.client.ClientConfig; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.ArrayList; import java.util.List; public class ResourceClient { public static void main(String[] args) { // 1. 创建客户端配置,自动注册JSON处理器 ClientConfig config = new ClientConfig(); Client client = ClientBuilder.newClient(config); // 2. 准备要发送的请求数据(只需要ID和新评论,其他字段可省略) Resource updateRequest = new Resource(); updateRequest.setId("1"); List<String> newComments = new ArrayList<>(); newComments.add("客户端发来的新评论"); newComments.add("第二条新评论"); updateRequest.setComments(newComments); // 3. 发送POST请求(注意URL不要有多余斜杠,你的原URL里的//要改成/) String serviceUrl = "http://localhost:8080/rest/resourceupdate"; Response response = client.target(serviceUrl) .request(MediaType.APPLICATION_JSON) .post(Entity.entity(updateRequest, MediaType.APPLICATION_JSON)); // 4. 处理响应 if (response.getStatus() == Response.Status.OK.getStatusCode()) { Resource updatedResource = response.readEntity(Resource.class); System.out.println("资源更新成功!"); System.out.println("资源ID:" + updatedResource.getId()); System.out.println("所有评论:"); updatedResource.getComments().forEach(comment -> System.out.println("- " + comment)); } else { System.out.println("更新失败,状态码:" + response.getStatus()); System.out.println("错误信息:" + response.readEntity(String.class)); } // 5. 关闭客户端 client.close(); } }
新手必看注意事项
- 服务端要配置好Jersey的Servlet,比如在
web.xml里:
<servlet> <servlet-name>Jersey REST服务</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>你的资源类所在包名</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST服务</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping>
- 如果用无
web.xml的Java EE配置,写一个Application类:
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/rest") public class MyRestApplication extends Application {}
- 确保URL没有多余斜杠,你原URL里的
http://host:port//rest/resourceupdate要改成http://host:port/rest/resourceupdate
内容的提问来源于stack exchange,提问作者sujeeth
相关产品推荐
相关产品推荐

