2013-08-19 1 views
1

JBoss Forge를 사용하여 내 응용 프로그램에 대한 REST API를 생성하고 있습니다.JBoss Forge 생성 된 REST 끝점에서 NULL 엔티티를 반환합니다.

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(); 
    } 

종점은 (패키지 이름 난독) 다음 명령 메시지라는 엔티티 생성 된

: ......

엔드 포인트에 대한 테스트를 작성하려면, 나는 다음과 같은 명령을 사용하여

@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 
    } 
} 

새로운 메시지가 응용 프로그램 서버에 의해 수신 :

arquillian create-test --class x.x.x.MessageEndpoint.java --enableJPA 

16,나는 다음 Response 개체에 getEntity()가 null를 돌려 것을 보여주기 위해 생성 된 테스트 클래스, MessageEndpointTest.java,의 기본 테스트를 확장 데이터베이스에 보관됩니다.

서버를 디버깅 할 때 엔티티가 Response을 만드는 메소드에 인수로 지정된 ID를 얻는 것을 볼 수 있습니다.

응용 프로그램 서버 로그에 오류가 없습니다.

Eclipse Kepler에서 JBoss EAP 6.1 및 JBoss Forge 버전 1.3.3을 사용하고 있습니다.

누구나 잘못 알거나 디버깅을 위해 조언을 줄 수 있습니까?

답변

0

RFC-2614 (Hypertext Transfer Protocol -- HTTP/1.1)을 확인한 후 REST 생성에서 올바른 응답을 기대하지 못했다는 것을 알 수 있습니다. 것을 RFC-2613 상태 :

새로 생성 된 자원

는 URI (들)에 의해 참조 될 수는 Location 헤더 필드

에 의해 주어진 리소스에 대한 가장 구체적인 URI와 함께, 에 응답의 실체를 반환

@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); 
    } 
:

이 새로운 발견의 지혜에 따라 내 테스트 코드를 업데이트 따라서 다음과 같습니다