休息服务添加一个额外的参数抛出错误

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 实例。