Jersey REST方法的复杂(非字符串)返回类型

时间:2012-12-21 19:06:31

标签: rest jersey

我无法设置一些我很确定/应该/很容易的东西,所以我想我会把它扔给人群。我似乎无法在网上或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

我不明白为什么这不起作用,我想我已经尝试了我能想到的一切。任何帮助或方向将非常感谢。

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

附注:您的网址不是RESTful - 您应该避免使用动词:

所以,而不是:

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

您应该使用:

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

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

答案 1 :(得分:0)

切换到我之前评论中提到的“具体类”解决方案是为我解决的问题。