休息服务添加一个额外的参数抛出错误
Rest service adding an extra parameter throws error
我正在尝试使用正文创建 REST 服务。当我尝试添加一个额外的参数(读取 POST 正文)时,其余请求不会被调用。
第一 JAVA CLASS:
@Path("{module}/{messageKey}")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response status(final @Context HttpServletRequest request, @PathParam("module") final String module, @PathParam("messageKey") final String messageKey, final GetMessageDAO dao) {
String messageText = "";
System.out.println(messageKey);
CacheControl cacheControl = new CacheControl();
cacheControl.setNoCache(true);
return Response.ok(String.valueOf(messageText)).cacheControl(cacheControl).build();
}
第二 Java Class:
public class GetMessageDAO {
@JsonProperty("args")
private String args;
public String getArgs() {
return args;
}
public void setArgs(String args) {
this.args = args;
}
}
JS调用:
new Ajax.Request(
'/ecmws/resources/message/gp/transactionManager.confirm.affected_calc_req',
{
method: 'post',
parameter: {args: "abc"},
data: {args: "abc"},
contentType: 'application/json;charset=UTF-8',
charset: 'UTF-8',
async: false});
当我从第一个 Java class 中删除最后一个参数时,它工作正常,但我还需要阅读 POST 正文,因此出现了问题。
我有 jersey-core、jersey-json、jersey-client、jersey-server、jackson-mapper 都在 classpath 中。
你能告诉我我遗漏了什么吗?
如果您将遵循 jersey example project,您必须有申请 class 扩展 ResourceConfig
,其中应包括您的 class 和 JacksonFeature
class
public class MyApplication extends ResourceConfig {
public MyApplication() {
super(
EmptyArrayResource.class,
NonJaxbBeanResource.class,
CombinedAnnotationResource.class,
// register Jackson ObjectMapper resolver
MyObjectMapperProvider.class,
ExceptionMappingTestResource.class,
JacksonFeature.class
);
- 在您的应用程序中,预先实例化您的
GetMessageDAO
class(就此而言,任何 DAO class)并将其作为构造函数参数传递给“1st Java class".
- 在“1st Java class”的构造函数中,将
GetMessageDAO
设置为字段变量
- 在方法
status
中,访问字段变量。
将 jersey-media-json-jackson denepndency 添加到您的项目。
它是 JSON Jackson 的支持模块。
您是否考虑过使用 @FormParam
或 @BeanForm
注释:
@POST
public String delivery(@FormParam("deliveryAddress") String deliveryAddress,
@FormParam("quantity") Long quantity)
{
return "Form parameters are " +
"[deliveryAddress=" + deliveryAddress + ", quantity=" + quantity + "]";
}
您需要设置正确的 Content-Type 以模拟表单提交操作。 \
要使用 -d 标志设置表单参数:
curl -X POST -H 'Content-Type:application/x-www-form-urlencoded' \
-d 'deliveryAddress=Street 1A&quantity=5' \
http://localhost:8080/application/delivery
输出:
Form parameters are [deliveryAddress=Street 1A, quantity=5]
您的 Jersey 控制器 不是 的问题,而是您在 中发送数据的方式AJAX来电.
如果您发出 postman 调用或 curl 您的请求,您可能不会遇到任何问题,即使使用 GetMessageDAO 方法也是如此按预期调用。但是从浏览器进行 ajax 调用会失败。
curl --request POST 'http://localhost:8080/todos/hello/world' --header 'Content-Type: application/json' --data-raw '{"args":"b"}'
要解决此问题,请更改线路
data: {args: "abc"},
到
data: JSON.stringify({args: 'abc'}),
进一步(验证):
如果你检查你的浏览器网络请求,数据没有 JSON.stringify被发送为
args=abc
但将其更改为 JSON.stringify 会将其更改为 JSON 字符串,您将看到发送的数据是:
{"args": "abc"}
然后可以编组到 GetMessageDAO
class 实例。
我正在尝试使用正文创建 REST 服务。当我尝试添加一个额外的参数(读取 POST 正文)时,其余请求不会被调用。
第一 JAVA CLASS:
@Path("{module}/{messageKey}")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response status(final @Context HttpServletRequest request, @PathParam("module") final String module, @PathParam("messageKey") final String messageKey, final GetMessageDAO dao) {
String messageText = "";
System.out.println(messageKey);
CacheControl cacheControl = new CacheControl();
cacheControl.setNoCache(true);
return Response.ok(String.valueOf(messageText)).cacheControl(cacheControl).build();
}
第二 Java Class:
public class GetMessageDAO {
@JsonProperty("args")
private String args;
public String getArgs() {
return args;
}
public void setArgs(String args) {
this.args = args;
}
}
JS调用:
new Ajax.Request(
'/ecmws/resources/message/gp/transactionManager.confirm.affected_calc_req',
{
method: 'post',
parameter: {args: "abc"},
data: {args: "abc"},
contentType: 'application/json;charset=UTF-8',
charset: 'UTF-8',
async: false});
当我从第一个 Java class 中删除最后一个参数时,它工作正常,但我还需要阅读 POST 正文,因此出现了问题。
我有 jersey-core、jersey-json、jersey-client、jersey-server、jackson-mapper 都在 classpath 中。
你能告诉我我遗漏了什么吗?
如果您将遵循 jersey example project,您必须有申请 class 扩展 ResourceConfig
,其中应包括您的 class 和 JacksonFeature
class
public class MyApplication extends ResourceConfig { public MyApplication() { super( EmptyArrayResource.class, NonJaxbBeanResource.class, CombinedAnnotationResource.class, // register Jackson ObjectMapper resolver MyObjectMapperProvider.class, ExceptionMappingTestResource.class, JacksonFeature.class );
- 在您的应用程序中,预先实例化您的
GetMessageDAO
class(就此而言,任何 DAO class)并将其作为构造函数参数传递给“1st Java class". - 在“1st Java class”的构造函数中,将
GetMessageDAO
设置为字段变量 - 在方法
status
中,访问字段变量。
将 jersey-media-json-jackson denepndency 添加到您的项目。
它是 JSON Jackson 的支持模块。
您是否考虑过使用 @FormParam
或 @BeanForm
注释:
@POST
public String delivery(@FormParam("deliveryAddress") String deliveryAddress,
@FormParam("quantity") Long quantity)
{
return "Form parameters are " +
"[deliveryAddress=" + deliveryAddress + ", quantity=" + quantity + "]";
}
您需要设置正确的 Content-Type 以模拟表单提交操作。 \
要使用 -d 标志设置表单参数:
curl -X POST -H 'Content-Type:application/x-www-form-urlencoded' \
-d 'deliveryAddress=Street 1A&quantity=5' \
http://localhost:8080/application/delivery
输出:
Form parameters are [deliveryAddress=Street 1A, quantity=5]
您的 Jersey 控制器 不是 的问题,而是您在 中发送数据的方式AJAX来电.
如果您发出 postman 调用或 curl 您的请求,您可能不会遇到任何问题,即使使用 GetMessageDAO 方法也是如此按预期调用。但是从浏览器进行 ajax 调用会失败。
curl --request POST 'http://localhost:8080/todos/hello/world' --header 'Content-Type: application/json' --data-raw '{"args":"b"}'
要解决此问题,请更改线路
data: {args: "abc"},
到
data: JSON.stringify({args: 'abc'}),
进一步(验证):
如果你检查你的浏览器网络请求,数据没有 JSON.stringify被发送为
args=abc
但将其更改为 JSON.stringify 会将其更改为 JSON 字符串,您将看到发送的数据是:
{"args": "abc"}
然后可以编组到 GetMessageDAO
class 实例。