【问题标题】:Jersey 2 POST and PUT parameter is nullJersey 2 POST 和 PUT 参数为空
【发布时间】:2015-03-03 20:17:04
【问题描述】:

当方法为 PUT 或 POST 时,我的球衣休息服务出现问题。问题是参数为空。我用 angularjs 和 jersey-test-framework 测试,结果相同,参数为空。

我认为问题是由于标题“Content-Type”,但我在测试中添加了这个,结果相同。

球衣版本:2.14

Jersey 模块:jersey-container-servlet、jersey-spring3、jersey-media-json-jackson

我的应用程序配置和对象映射器:

public class CustomObjectMapper implements ContextResolver<ObjectMapper> {

   final ObjectMapper defaultObjectMapper;

   public CustomObjectMapper() {
      defaultObjectMapper = createDefaultMapper();
   }

   @Override
   public ObjectMapper getContext(final Class<?> type) {
      return defaultObjectMapper;
   }

   private static ObjectMapper createDefaultMapper() {
      final ObjectMapper result = new ObjectMapper();

      return result;
   }

}

@ApplicationPath("/")
public class ApplicationConfig extends ResourceConfig {

   public ApplicationConfig() {
      packages("es.fjtorres.cpFacturas.server.api.impl",
            "es.fjtorres.cpFacturas.server.config",
            "es.fjtorres.cpFacturas.server.filter",
            "com.fasterxml.jackson.jaxrs");

      property(
           "jersey.config.beanValidation.enableOutputValidationErrorEntity.server",
            true);

      register(CustomObjectMapper.class);
      register(JacksonFeature.class);
   }
}

我的资源部分代码:

@Named
@Path(CUSTOMERS_PATH)
@Produces(MediaType.APPLICATION_JSON)
public class CustomerResourceImpl extends AbstractResource implements
      ICustomerResource 

   ...

   @Override
   @POST
   @Consumes(MediaType.APPLICATION_JSON)
   public Response add(final CustomerDto pDto) {
      try {
         getService().add(pDto);
      } catch (final ValidationException ve) {
         badRequest(ve.getErrors());
      }

      return Response.ok().build();
   }

}

我的单元测试:

@Test
public void addTest() {
    final Response response = target(NameTokens.CUSTOMERS_PATH).request()
            .header("Content-Type", MediaType.APPLICATION_JSON)
            .post(Entity.entity(new CustomerDto(), MediaType.APPLICATION_JSON));

    Assert.assertNotNull(response, "Response cannot be null");
    Assert.assertEquals(response.getStatus(), Status.OK.getStatusCode(),
            "Response status code isn't ok");
}

【问题讨论】:

  • 请向我们展示您的 CustomerDto 提供者(MessageBodyReader,将发布的 json 转换为 CustomerDto 实例)
  • 我没有 customerdto 的提供者,我认为这份工作是为 jersey-media-json-jackson 准备的。我有两条使用 GET 方法的路径,并正确返回 json 中的 customerdto 信息。

标签: java jax-rs jersey-2.0


【解决方案1】:

问题是 CORS 过滤器,我查看过滤器代码以解决 POST 和 PUT 请求的问题。我有两个 CORS 过滤器(一个用于请求,另一个用于响应),代码如下。

@Provider
public class CorsRequestFilter implements ContainerRequestFilter {

   @Override
   public void filter(final ContainerRequestContext requestContext)
         throws IOException {
      if (requestContext.getRequest().getMethod().equals(HttpMethod.OPTIONS)) {
         requestContext.abortWith(Response.status(Response.Status.OK).build());
      }
   }
}

@Provider
public class CorsResponseFilter implements ContainerResponseFilter {

    @Override
    public void filter(final ContainerRequestContext requestContext,
            final ContainerResponseContext responseContext) throws IOException {
        final MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS");
        headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Auth-Token");
    }

}

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 2015-01-03
    • 2012-05-08
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多