2011-08-12 5 views
4

여기에 RESt 웹 서비스 용으로 작성된 @ javax.xml.bind.annotation.Xml ... 주석이있는 클래스가 있습니다. Jersey는 스프링 관리 웹 컨테이너에 설치되며 웹 서비스는 잘 형식화 된 XML을 반환합니다. 우리는 maven-enunciate-plugin을 사용하여 웹 서비스를 문서화하고 반환 된 XML 문서에 xsd를 작성합니다. 이제 xml 유효성 검사에서 누락 된 정의에 대해 불평하지 않도록 문서 xsd 파일을 반환 된 XML 파일 내의 schemaLocation으로 사용하려고합니다. XML serialization을 어떻게 구성 할 수 있습니까?저지 JAXB 직렬화의 XML 출력을 사용자 정의하는 방법

답변

7

올바르게 기억한다면 생성 된 XML에 네임 스페이스 식별자를 올바르게 작성해야합니다.

1) 커스텀 마셜 러 (unmarshaller, 역시 BTW)를 설정해 돌려주는 JaxbFactory를 작성했습니다. 나는 그 팩토리 클래스가 저지 "볼 수"없습니다)

//constructor 
public JaxbFactory() throws Exception { 
    context = JAXBContext.newInstance(ResourceDto.class); 

    // Setup the marshaller 
    marshaller = context.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
    marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, XmlMetadataConstants.XML_SCHEMA_LOCATION); // this schema location is used in generating the schema-location property in the xml 
} 

2 ... 게터를 생략/아래 설정을 비 정렬 화하고있다. 이를 표시하기 위해 MarshallerProvider를 만듭니다. 즉,이 같은 같습니다 내가 저지 저지를 사용하여 봄에 유선있어

@Provider 
public class ResourceJaxbMarshallerProvider implements ContextResolver<Marshaller> { 
// injected by Spring 
private ResourceJaxbFactory ResourceJaxbFactory; 
private ResourceStatusJaxbFactory ResourceStatusJaxbFactory; 


/* 
* ---------------------------------------- 
* Setters (for Spring injected properties) 
* ---------------------------------------- 
*/ 
public void setResourceJaxbFactory(ResourceJaxbFactory ResourceJaxbFactory) { 
    this.ResourceJaxbFactory = ResourceJaxbFactory; 
} 

public void setResourceStatusJaxbFactory(ResourceStatusJaxbFactory ResourceStatusJaxbFactory) { 
    this.ResourceStatusJaxbFactory = ResourceStatusJaxbFactory; 
} 

/* 
* ------------------------ 
* Interface Implementation 
* ------------------------ 
*/ 
public Marshaller getContext(Class<?> type) { 
    if (type == ResourceDto.class) 
     return ResourceJaxbFactory.getMarshaller(); 
    else if (type == ResourceStatusDto.class) 
     return ResourceStatusJaxbFactory.getMarshaller(); 
    else 
     return null; 
}  
} 

을/Spring에 의해 작성되는 봄 서블릿 그래서 어떤 @provider 클래스는 자동으로 저지에 의해 인식됩니다. 내 Spring applicationContext.xml에서 자원 제공자를 인스턴스화하기 만하면된다. 그것은 차례 차례로 공장에서 마샬 러를 잡으러 갈 것입니다.

3) 내가 비판적으로 발견 한 다른 하나는 내 리소스가 포함 된 루트 패키지에 package-info.java 파일을 만들어야한다는 것입니다. 다음과 같습니다

/* 
* Note that this file is critical for ensuring that our ResourceDto object is 
* marshalled/unmarshalled with the correct namespace. Without this, marshalled 
* classes produce XML files without a namespace identifier 
*/ 
@XmlSchema(namespace = XmlMetadataConstants.XML_SCHEMA_NAMESPACE, elementFormDefault = XmlNsForm.QUALIFIED) 
package com.yourcompany.resource; 

import javax.xml.bind.annotation.XmlNsForm; 

가 적어도 내가 할하는 데 필요한 모든이의 생각 , 나는 모든 단일 조각을 기억할 수 없습니다. 나는 package-info.java 조각이 모두 함께 모여 든 마지막 중요한 톱니 바퀴라는 것을 기억한다.

희망이 있습니다. 나는이 모든 것에 대한 정보를 얻기 위해 너무 많은 시간을 썼다. Jersey는 적절한 xml 스키마 유효성 검사 (스키마 유효하지 않은 입력에 대한 올바른 오류보고)를 수행하기 전에 간단하게 간단했습니다. 일단 내가 그 길을 시작하면 저지는 뇌사에서 쉽게 딱딱하게 움직였다. 그 어려움의 대부분은 온라인의 다양한 게시물에서 모든 세부 사항을 밝혀내는 것이 었습니다. 다행히도 이것은 당신을 더 멀리, 더 빨리 데려 올 것입니다. :-)

관련 문제