Java Jersey Jax-WS 未收到 JSON 参数

Java Jersey Jax-WS not receiving JSON parameters

我继承了一个包含许多 Web 服务的大型项目。似乎它们是使用 Jersey Jax-WS 创建的。我的任务是让其中一位接受 JSON 作为 POST 请求。想不通为什么收不到参数

我正在使用 SoapUI 发送请求 RESTful 请求。我创建了一个 REST 项目并设置了所需的端点和资源值。媒体类型下拉字段设置为 application/json。这是我放在媒体类型字段正下方的文本区域中的 JSON 字符串:

{"corp":" 877310","rateCodes":["N6","3Z"],"headend_designator":" 238005"," eqp_protocol_aiu":"M3","eqp_typ_aiu":"JD"}

现在在我的 java 文件中,名为 BsgHandleResource

@WebService
@Singleton
@Path("/bsghandle")
public class BsgHandleResource {

再往下我有这个方法:

@POST
@Path("/getBsgHandles")
@Consumes(MediaType.APPLICATION_JSON)
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public BsgHandleResponse getBsgHandlesJson(
        @PathParam("appkey") String appkey,
        @PathParam("rateCodes") final List<String> rateCodes,
        @PathParam("corp") String corp,
        @PathParam("headend_designator") String headend_designator,
        @PathParam("eqp_protocol_aiu") String eqp_protocol_aiu,
        @PathParam("eqp_typ_aiu") String eqp_typ_aiu,
        @PathParam("forceUpdate") boolean forceUpdate) {

    HttpServletRequest request = getRequestObject();

    logger.debug("getBsgHandlesJson() called for rateCodes="
            + rateCodes.toString() + " from ip" + request.getRemoteAddr());

    return processGetBsgHandleByRateCode(appkey, rateCodes, corp, 
        headend_designator, eqp_protocol_aiu, eqp_typ_aiu, 
                    forceUpdate, request);
}

当我从 SoapUI 发送请求时,我在日志文件中看到的输出是:

getBsgHandlesJson() called for rateCodes=[]...

我的 pom.xml 文件包含这些依赖项:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.8</version>
</dependency>   

有人可以建议我缺少什么吗?

编辑:关于 user2004685 的建议,我的代码现在如下所示:

@POST
@Path("/getBsgHandles")
@Consumes(MediaType.APPLICATION_JSON)
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public BsgHandleResponse getBsgHandlesJson(BsgHandleRequest obj) {

    HttpServletRequest request = getRequestObject();

    logger.debug("getBsgHandlesJson() called for rateCodes="
            + obj.getRateCodes().toString() + " from ip" + request.getRemoteAddr());

    return processGetBsgHandleByRateCode(obj.getAppkey(), obj.getRateCodes(), obj.getCorp(), 
        obj.getHeadendDesignator(), obj.getEqpProtocolAiu(), obj.getEqpTypAiu(), 
                    obj.getForceUpdate(), request);

}

但现在我什至没有得到任何记录器输出。我确实在 soapui 响应中收到以下错误:

<data contentType="text/plain" contentLength="343"><![CDATA[Unrecognized field "headend_designator" (Class com.our.company.oss.vcwh.queryservice.billing.BsgHandleRequest), not marked as ignorable
 at [Source: org.apache.catalina.connector.CoyoteInputStream@6bb342eb; line: 1, column: 65] (through reference chain: com.our.company.oss.vcwh.queryservice.billing.BsgHandleRequest["headend_designator"])]]></data>

以下是 BsgHandleRequest.java 中的字段:

@XmlRootElement(name = "bsgHandleRequest")
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class BsgHandleRequest {

    private static final long serialVersionUID = 1L;

    private List<String> rateCodes;
    private String corp;
    private String headend_designator;
    private String eqp_protocol_aiu;
    private String eqp_typ_aiu;
    private String appkey;
    private boolean forceUpdate;

这是 getter 和 headend_designator 的 setter。我没有发现任何错误或与其他任何不同之处。

public String getHeadendDesignator() {
    return headend_designator;
}
public void setHeadendDesignator(String headend_designator) {
    this.headend_designator = headend_designator;
}

您的路径 @Path("/getBsgHandles") 中没有路径参数,您正在尝试使用 @PathParam。您应该改用 POJO 对象。

为您的请求对象创建一个新的 POJO Class:

public class MyRequestObject {
    private String appkey;
    private List<String> rateCodes;
    private String corp;
    private String headend_designator;
    private String eqp_protocol_aiu;
    private String eqp_typ_aiu;
    private boolean forceUpdate;

    /* Constructor */
    public MyRequestObject() {}

    /* Getter-Setters */
}

像这样更改您的代码以使用您的 POJO 对象:

@POST
@Path("/getBsgHandles")
    @Consumes(MediaType.APPLICATION_JSON)
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public BsgHandleResponse getBsgHandlesJson(MyRequestObject obj) {

    HttpServletRequest request = getRequestObject();

    LOGGER.debug("getBsgHandlesJson() called for rateCodes="
            + obj.getRateCodes().toString() + " from ip" + request.getRemoteAddr());

    return processGetBsgHandleByRateCode(obj.getAppkey(), obj.getRateCodes(), obj.getCorp(), 
        obj.getHeadendDesignator(), obj.getEqpProtocolAiu(), obj.getEqpTypAiu(), 
                    obj.getForceUpdate(), request);
}