You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:15:46