JBoss Forge生成的REST端点返回NULL实体

时间:2013-08-19 11:03:39

标签: java rest jboss7.x jboss-arquillian

我正在使用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。

有人能发现出现问题或提出调试建议吗?

1 个答案:

答案 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);
   }