我正在使用JBoss Forge为我的应用程序生成REST API。已使用以下命令为包含Message的实体生成端点(包名称已经过模糊处理):
rest endpoint-from-entity x.x.x.Message --contentType application/xml
这会产生一个带有以下create方法的MessageEndpoint.java:
@Stateless @Path("/messages") public class MessageEndpoint { @PersistenceContext(unitName = "forge-default") private EntityManager em; @POST @Consumes("application/xml") public Response create(Message entity) { em.persist(entity); return Response.created(UriBuilder.fromResource(MessageEndpoint.class).path(String.valueOf(entity.getId())).build()).build(); }
...
要为端点创建测试,我使用以下命令:
arquillian create-test --class x.x.x.MessageEndpoint.java --enableJPA
然后我在生成的测试类MessageEndpointTest.java中扩展了默认测试,以显示Response对象上的getEntity()返回null:
@RunWith(Arquillian.class)
public class MessageEndpointTest
{
@Inject
private MessageEndpoint messageEndpoint;
@Deployment
public static JavaArchive createDeployment()
{
return ShrinkWrap.create(JavaArchive.class, "test.jar")
.addClass(MessageEndpoint.class)
.addClass(Message.class)
.addAsManifestResource("META-INF/persistence.xml", "persistence.xml")
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Test
public void testIsDeployed()
{
Assert.assertNotNull(messageEndpoint);
Response r = messageEndpoint.create(new Message());
Assert.assertNotNull(r.getEntity()); // getEntity returns null
}
}
新消息由应用程序服务器接收并保留在数据库中。
在调试服务器时,我可以看到该实体确实获得了一个ID,其名称为
创建Response
。
应用程序服务器日志中没有错误。
我在Eclipse Kepler中使用JBoss EAP 6.1和JBoss Forge版本1.3.3。
有人能发现出现问题或提出调试建议吗?
答案 0 :(得分:0)
好的,所以在检查RFC-2614 (Hypertext Transfer Protocol -- HTTP/1.1)之后,我可以看到我没想到REST创建的正确响应。 RFC-2613声明:
新创建的资源可以通过返回的URI引用 响应的实体,具有最具体的URI 由Location头字段
提供的资源
根据这一新发现的智慧更新我的测试代码,如下所示:
@Test
public void testIsDeployed()
{
Assert.assertNotNull(damnedendpoint);
Response r = damnedendpoint.create(new Damned());
URI location = (URI)r.getMetadata().get("Location").get(0); // URI = "/messages/<id of the newly created Message>"
Assert.assertNotNull(location);
}