我无法设置一些我很确定/应该/很容易的东西,所以我想我会把它扔给人群。我似乎无法在网上或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
我不明白为什么这不起作用,我想我已经尝试了我能想到的一切。任何帮助或方向将非常感谢。
非常感谢!
答案 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)
切换到我之前评论中提到的“具体类”解决方案是为我解决的问题。