1

我正在使用 JBoss Forge 为我的应用程序生成 REST API。已使用以下命令为名为 Message 的实体生成端点(包名已混淆):

rest endpoint-from-entity x.x.x.Message --contentType application/xml

这将产生一个带有以下创建方法的 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,该 ID 作为创建Response.

应用程序服务器日志中没有错误。

我在 Eclipse Kepler 中使用 JBoss EAP 6.1 和 JBoss Forge 1.3.3 版。

任何人都可以发现问题所在或提供一些调试建议吗?

4

1 回答 1

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);
   }
于 2013-08-19T20:37:51.253 回答