2009-10-09 4 views
5

Jersey를 사용하여 직접 정렬 및 비 정렬화된 여러 JAXB bean이 있습니다.JAXB Collections (List <T>) 요소 이름에 대해 Camel Case 대신 Pascal Case 사용

예.

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Artifact", propOrder = { 
    "artifactId", 
    "artifactType", 
    "contentHash" 
}) 
@XmlSeeAlso({ 
    EmailArtifact.class, 
    ManagedDocArtifact.class 
}) 
@XmlRootElement(name ="Artifact") 
public class Artifact { 

    protected String artifactId; 
    protected String artifactType; 
    protected String contentHash; 

... 
... 
... 

} 

하나의 이슈 개체를 반환하는 GET 메서드를 만드는 경우. 여기

<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 

내가 성공적으로 처음에 대문자 "A"를 가지고 이슈 요소의 이름을 제어 할 수 있었다 : 그것은 제대로 XML을 생성합니다. 당신이 컬렉션이 낮은 경우 "A"가에 대한 외부 요소를 볼 수 있듯이

<artifacts> 
<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 
<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 
</artifacts> 

:

는 그러나, 나는 유물 개체의 컬렉션을 반환 get 메소드를 작성, 내가 끝낼. 우리 자신의 내부 표준을 준수하기 위해 저는 이것을 자본 "A"가되기를 바랍니다 - 인공물.

JAXB 내에서 정의 할 수있는 위치를 확인할 수 없습니다. 실제로 이것을 제어하는 ​​Jersey 프레임 워크입니까?

컬렉션을 위해 생성 된 요소 이름을 제어 할 수 있습니까?

많은 감사,

제임스

+1

1. AFAIK JAXB 마샬에 같은 (' 예를 들어,'ArrayList를) 컬렉션을 당신을 허용하지 않습니다. 하지만 컬렉션으로 속성을 가진 객체를 직렬화 할 수 있습니다. 2.나는 Jersey에 익숙하지 않지만 각각의 이슈를 개별적으로 직렬화하는 JAXB와 그 청크의 전체 문서를 구성하는 다른 레이어 (Jersey)가 있는지 또는 컬렉션을 위해 XML을 처리하는 JAXB인지 여부를 알아야한다고 생각한다. 3. 일부 코드를 게시하거나 (어딘가에 게시 할 수 있습니까?) 어떻게 호출 할 수 있습니까? 나는 간단한 JAXB로 시도했지만 이것은 당신의 설정을 모방하지 않는다. –

+1

나는 당신이 옳다고 생각한다. 저지는 JAXB 빈 컬렉션을 마샬링/언 마샬링 할 수있게 해준다. (저지 사용자 그룹에서도 이것을 제기했다.) 따라서 컬렉션을위한 XML 요소 이름 뒤에 이름이나 규칙을 설정할 수있는 몇 가지 구성이 필요합니다. 우리는 기다려 볼 것입니다. 예를 들어, 새로운 JAXB bean을 생성하는 방법이 있습니다. 하나의 컬렉션 멤버가있는 "Artifacts"를 예로 들어 보겠습니다. List 인공물 - 많은 가치를 추가하지 않는 클래스를 소개하지만 느낀다. 도와 주셔서 감사합니다. James – jallch

답변

9

name 속성을 지원 @XmlElementWrapper를 사용해보십시오 :

@XmlElementWrapper(name="ELEMENTS") 
@XmlElement(name="ELEMENT") 
protected final List<String> elements = new LinkedList<String>(); 

<ELEMENTS> 
    <ELEMENT>one</ELEMENT> 
    <ELEMENT>two</ELEMENT> 
    ... 
</ELEMENTS> 

이 기능에 대한 JAXB Tutorial를 참조 생성합니다.

+1

안녕하세요, 불행히도 XmlElementWrapper를 알고 있지만 내 사용 사례에는 해당되지 않습니다. Jersey 내에서는 JAXB 빈 컬렉션을 생성하고 소비 할 수 있습니다. 예 : 공개 목록 getMyBeans MyBean 클래스에 주석을 달기 위해 XmlElementWrapper를 사용할 수 없습니다. 예를 들어 클래스의 속성에 대해서만이 주석을 사용할 수 있습니다. 클래스 내의 콜렉션. 그래서 이것은 좋지 않을 것입니다. 컬렉션을 포함하는 새로운 클래스를 사용할 수 있다는 점에서 해결책이 있지만 솔직히 말해서 실제로 필요하지 않은 클래스를 클래스 내에 생성하는 것입니다. – jallch

+0

XML에 대한 좋은 점은 1000 가지 방식으로 변형 될 수 있다는 것입니다. ** XSLT ** 또는 ** DOM **을 사용할 수 있습니다. –

+0

감사합니다. 귀하의 솔루션은 목록의 직렬화와 관련된 또 다른 문제를 해결했습니다. – Pragmateek

5

확인 - Java Jersey 커뮤니티 리더 인 Paul Sandoz가 업데이트했습니다. 이것은 현재 Jersey 프레임 워크의 미해결 문제이며 향후 해결 방법이 수정 될 때까지 해결해야하거나 동의해야합니다.

위의 설명 중 하나에서 설명한 해결 방법은 JAXB 어노테이션이 적용된 bean의 콜렉션 (예 : List)을 리턴하는 각 웹 서비스 메소드에 대한 새로운 클래스를 소개하는 것입니다. 이 클래스는 실질적으로 단 하나의 멤버 인 JAXB beans 목록을 포함하는 클래스입니다. 웹 서비스 메서드에서 List를 반환하는 대신 특수 클래스를 반환합니다. XML에서 새 클래스의 이름을 제어 할 수 있으므로 @XmlRootElement (name = "Artifacts") 우리는 단기간에 문제를 해결할 수 있습니다.

희망이 도움이됩니다.

감사합니다,

제임스는

+0

현재 Jersey 버전 (1.11)에 해결책이 있는지 알고 있습니까? 저지에 대한 모든 포인터/기능에 대한 문제? – Yaegor