【问题标题】:Java Jersey Jax-WS not receiving JSON parametersJava Jersey Jax-WS 未接收 JSON 参数
【发布时间】:2016-02-02 20:15:57
【问题描述】:

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

我正在使用 SoapUI 发送请求 RESTful 请求。我创建了一个 REST 项目并设置了所需的 Endpoint 和 Resource 值。媒体类型下拉字段设置为 application/json。这是我放置在 Media Type 字段下方的 textarea 中的 JSON 字符串:

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

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

@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;

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

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

【问题讨论】:

    标签: java json maven jersey jax-ws


    【解决方案1】:

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

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

    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);
    }
    

    【讨论】:

    • 啊...这很有意义。但是我按照你说的做了,现在什么也没有发生。甚至没有任何记录器输出。我将编辑我的帖子以显示。
    • 我在执行请求时正在查看日志文件 (tail -f),但没有任何显示。没有错误或堆栈跟踪。
    • 我对让 BsgHandleResponse 也作为请求对象执行双重职责感到紧张,所以我编写了一个单独的,只有适用的 getter 和 setter。但是,现在它给出了不同的错误。我在上面进行了编辑。
    • 好像看不到headend_designator。尝试删除_ 并将其更改为headendDesignator 之类的内容,看看是否可行。
    • 是的,成功了!我不敢相信 json 有下划线的问题?但现在它返回一个空的 bsgHandleList 数组。 "bsgHandleList": [], 这是肥皂对应的工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多