2013-12-09 1 views
1

현재 마샬링 한 XML을 언 마샬링 할 때 몇 가지 문제가 있습니다. 마셜 링이 훌륭하게 진행되었다고 생각 했으므로 시간을내어 알아 냈습니다 (예외는 없습니다). 내 XML 반환을 생산하는 방법XML을 생성 할 때 기묘한 응답 JAX-RS

<?xml version="1.0" encoding="UTF-8"?> version="1.0" encoding="UTF-8" standalone="yes" 
    <TestClass> 
     <testValue>banaan</testValue> 
    </TestClass> 

그러나 갑자기 내가 생성 된 XML 전혀 정확하지 않은 것을 매우 분명 실현 (너무 늦게)했다. 그것은 분명히해야한다 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <TestClass> 
     <testValue>banaan</testValue> 
    </TestClass> 

어떻게 가능이 매우 간단한 코드가 :

@Path("test") 
@GET 
@Produces(MediaType.APPLICATION_XML) 
public TestClass getTestClass() { 
    TestClass test = new TestClass(); 
    test.setTestValue("banaan"); 
    return test; 
} 

그리고 TestClass에 :

@XmlRootElement(name = "TestClass") 
public class TestClass { 

private String testValue; 

@XmlElement(name = "testValue") 
public String getTestValue() { 
    return testValue; 
} 

public void setTestValue(String testValue) { 
    this.testValue = testValue; 
} 

public TestClass() { 

} 

}

가 유효하지 않은 XML을 생성? 더 중요한 것은 어떻게 해결할 수 있습니까?

+0

어떤 버전의 Glassfish를 사용하고 있습니까? XSD에서 TestClass를 생성하기 위해 XJC를 사용하고 있습니까? 아니면 직접 주석을 추가 했습니까? classpath에 외부 라이브러리를 추가하고 있습니까? – LINEMAN78

+0

죄송합니다. XJC와 XSD가 무슨 뜻인지 잘 모르겠습니다. 가능한 가장 단순한 일을하고있을 것입니다. TestClass는이 목적을 위해 만든 간단한 클래스이며 실제로 주석을 달았습니다 (TestClass의 코드에 대한 업데이트 된 질문 참조). 한 번에 프로젝트에 추가 된 다른 라이브러리가 있었지만 얼마 전에 삭제되었습니다. – Henk

+0

그리고 Glassfish 서버 4를 사용하고 있습니다. – Henk

답변

1

올바르게 작동해야하는 JAXBContext를 만들기 위해 기본 시도를 사용하고 있지만, 어쨌든 엉망이되는 것 같습니다. 애플리케이션에 맞춤형 컨텍스트 분석기를 추가하십시오.

@Provider 
public class XmlContextProvider implements ContextResolver<JAXBContext> { 
    private JAXBContext context = null; 

    public JAXBContext getContext(Class<?> type) { 
     if (type != TestClass.class) { 
      return null; // we don't support nothing else than TestClass 
     } 

     if (context == null) { 
      try { 
       context = JAXBContext.newInstance(TestClass.class); 
      } catch (JAXBException e) { 
       e.printStackTrace(); 
      } 
     } 
     return context; 
    } 
} 

또한 Application 클래스에 XmlContextProvider를 추가해야합니다.

+0

시도해 보았지만 여전히 동일한 XML을 생성합니다. Application 클래스별로 ApplicationConfig를 의미합니까? 왜냐하면 나는 Application 클래스를 찾지 못했기 때문이다. 또한 NetBeans는 자동으로 XmlContentProvider를 ApplicationConfig에 다음과 같이 추가했습니다.add (HelloWorldResource.XmlContextProvider.class); ' – Henk

+0

NetBeans의 J2EE 개발 기능을 사용하지 않았으므로 응용 프로그램 관리가 어떻게 수행되는지 잘 모릅니다. 내 생각 엔 ApplicationConfig 클래스는 web.xml에서 참조하는 올바른 애플리케이션 클래스이며 javax.ws.rs.core.Application을 확장 한 것입니다. getContext 메소드에 println을 추가하고 로그가 호출되는지 확인하십시오. – LINEMAN78

+0

웹 서비스를 어떻게 테스트하고 있습니까? 브라우저? 그렇다면 서버를 통해 반환되는 원시 데이터를 볼 수 있도록 원본을 마우스 오른쪽 버튼으로 클릭하여 봅니다. ReST 서비스 테스트를 위해 Chrome Plugin Postman을 사용하는 것이 좋습니다. – LINEMAN78

0

어떻게 코드를 마샬링합니까? 당신이 제대로 클래스와 그 값을 설정하는 것 같다,하지만 당신은 예를 들어 JAXBContext context = JAXBContext.newInstance(TestClass.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); StringWriter stringWriter = new StringWriter(); m.marshal(test, stringWriter); return stringWriter.toString();

에게 마샬 객체와 당신이 여기

을 사용하는 컨텍스트/포맷 출력되는 만드는 방법에 문제가 될 수 있습니다 이 줄을 따라 뭔가를 했니?

+0

음, Netbeans와 Glassfish 서버와 함께 Jersey가 포함 된 RESTful Web Services 플러그인을 사용하고 있습니다. 저는 지금 사용하고있는 예제가 포함 된 Jersey 문서를 단순히 따르고 있습니다. 저는 마샬링과 언 마샬링이 모두 저지에서 이루어 졌다고 생각합니다. 그래서 어떻게 마샬링하는지 잘 모르겠습니다. 추신 : 질문에 잘못 대답하거나 잘못된 용어를 사용하면 실례합니다. – Henk

+0

POST 요청의 본문을 가져 와서 String처럼 처리 한 다음 직접 마샬링 할 수 있다는 것을 알고 있습니다. 그러나 설명서에서 읽은 멋진 것들 중 1 가지는 저지가 모든 것을 자동으로 처리 할 수 ​​있다는 것입니다. – Henk

+0

글쎄, 당신이 제안했지만 여전히 시도해 보았습니다. http://i.imgur.com/m1LEOgu.png – Henk

관련 문제