1

e 我正在尝试使用 JUnit 中的 Jersey 客户端对 REST 服务的 JSON 有效负载进行 POST 操作。这是我所做的:

资源类

@Path("/Users")
@Component
public class UserResource{
@POST
@Path("register")
@Consumes({MediaType.APPLICATION_JSON})
@Produces(MediaType.APPLICATION_JSON)
public String registerUser(RegisterRequestJSON requestJson)
{
         User user = userManager.getUserInformationByEmail(email);
        UserInfoJSON userInfoJSON = new UserInfoJSON();
        userInfoJSON.copyFromUserBean(user);
        GoodResponseObject gro = new GoodResponseObject(Status.OK.getStatusCode(), Status.OK.getReasonPhrase(), userInfoJSON);
        try {
            return Formatter.getAsJson(gro, true);
        } catch (Exception e) {
            throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(e).build());
        } 
      }
  }

资源测试

String registerUserUrl = "http://localhost:9998/Users/Path";
    JSONObject inputJsonObj = new JSONObject();
    inputJsonObj.put("accessToken", userAccessToken );
    inputJsonObj.put("accessTokenType", "example" );
    ClientConfig clientConfigRegisterUser = new DefaultClientConfig();
    clientConfigRegisterUser.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,Boolean.TRUE);
    Client clientRegisterUser = Client.create(clientConfigRegisterUser);
    WebResource registerUser = clientRegisterUser.resource(registerUserUrl); 
    String registerResponse = registerUser.type(MediaType.APPLICATION_JSON).post(String.class,registerJson);

当我运行测试时,我收到以下错误:

com.sun.jersey.api.client.ClientHandlerException: com.sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class com.genie.account.mgmt.json.RegisterRequestJSON, and MIME media type, application/json, was not found
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:151)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:568)
at com.genie.account.mgmt.resources.UserResourceTest.testGetUserInformationByEmail(UserResourceTest.java:97)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: com.sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class com.genie.account.mgmt.json.RegisterRequestJSON, and MIME media type, application/json, was not found
at com.sun.jersey.api.client.RequestWriter.writeRequestEntity(RequestWriter.java:288)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:213)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149)

这里可能是什么问题?

4

1 回答 1

0

您的客户端不知道如何序列化(写入)com.genie.account.mgmt.json.RegisterRequestJSON 参数以将其发送到 REST 端点。

默认情况下,Jersey 尝试使用 JAXB 序列化为 JSON/XML,但您的 RegisterRequestJSON 参数类型应该被注释

另一种选择是使用此答案中所述的自定义编写器/读取器:

在泽西岛,我如何让一些方法使用 POJO 映射功能而另一些不使用?

于 2013-05-31T15:47:54.070 回答