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);
}
我继承了一个包含许多 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);
}