0

我在设置一些我很确定/应该/很容易的东西时遇到了麻烦,所以我想我会把它扔给人群。我似乎无法在网络或 SE 上的其他地方找到我正在寻找的东西。

我当然是在简化我的项目,但基本上我有一个 JAX-WS 带注释的 Jersey 资源类,它看起来像这样:

@Path("myresource")
public class MyResource {

    @Autowired
    MyComplexObjectDAO daoInstance;

    @Path("findObject/{id}")
    @GET
    public MyComplexObject findObject( @PathParam(value="id") String id ) {
        return daoInstance.findObject( id );
    }

    @Path("saveObject")
    @PUT
    public MyComplexObject saveObject( MyComplexObject objectToSave ) {
        MyComplexObject savedObject = daoInstance.saveObject( objectToSave );
        return savedObject;
    }

}

所以你可以看到我正在使用 spring 自动装配 DAO 对象,然后我在 REST 处理程序中使用 DAO 方法。

'findObject' 调用似乎工作正常 - 到目前为止,它完全按照我的预期工作。

'saveObject' 调用没有按我想要的方式工作,这就是我需要一些建议的地方。

您可以看到我正在尝试直接将我的复杂对象的实例作为 REST 方法的参数。另外,我想在保存复杂对象后返回一个实例。

我整理了一些“客户端”代码来测试它。

@Test
public void saveTest() {
    WebResource wsClient = createWebServiceClient();

    MyComplexObject unsavedInstance = createMyComplexObject();

    MyComplexObject savedInstance = 
            wsClient
            .path("saveObject")
            .accept(MediaType.APPLICATION_XML)
            .put(MyComplexObject.class, unsavedInstance);

    assertNotNull(savedIntent);
}

返回以下错误:

com.sun.jersey.api.client.UniformInterfaceException: PUT http://localhost:8081/rest/myresource/save returned a response status of 400 Bad Request

我不明白为什么这不起作用,我想我已经尝试了我能想到的一切。任何帮助或指导将不胜感激。

非常感谢!

4

2 回答 2

1

我看到您在测试客户端中调用了 accept() 方法(这意味着将“Accept:”标头添加到请求中,指示服务器您想要哪种类型的表示)。但是,您不会调用 type() 方法来添加“Content-type:”标头并通知服务器您正在发送 XML 数据。有关示例,请参见http://jersey.java.net/nonav/documentation/latest/client-api.html#d4e644

旁注:您的 URL 不是 RESTful - 您应该避免路径中的动词:

所以,而不是:

/api/findObject/{id}
/api/saveObject

你应该使用:

/api/objects/{id}
/api/objects

最后一点:要在调用 /api/objects 时创建对象,您应该执行 POST 而不是 PUT,以遵守 REST 最佳实践和广泛采用的模式。

于 2012-12-22T06:48:33.127 回答
0

切换到我在之前的评论中提到的“具体课程”解决方案是解决问题的方法。

于 2013-03-25T18:16:29.710 回答