지식
Jaxb2Marshaller 를 이용한 XML namespace prefix 설정
애앨리
2020. 12. 1. 11:07
업무 중에 XML 페이지를 생성하여 제공해줄 일이 생겨서 찾아봤는데
한글 레퍼런스에는 prefix 설명이 없어 남겨봄.
일단 Jaxb2Marshaller 를 이용 xml 페이지 만드는 곳 까지는 다 성공하셨을 거라는 생각에
마샬러 셋팅은 빼고
일단 본인은 스프링 부트 기반 이어 마샬러 빈등 록을 @Configuration 어노테이션을 통해 등록
사용 하였다.
보통 다른분들 소스 볼 때 임포트 되는 라이브러리를 표기 안 해주는 경우가 많아 동일한 라이브러리 명일 경우
헷갈려서 저는 그냥 통으로 올림. 그리고 긁어가기 방지 스크립트는 왜 들 그렇게 다 걸어놓는지 해제하기 엄첨 쉬운데..
개인적인 불만..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
import com.wivismall.front.biz.persistence.domain.WfoCriteo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.BeanNameViewResolver;
import org.springframework.web.servlet.view.xml.MarshallingView;
import java.util.HashMap;
import java.util.Map;
/**
* XML Configuration
* @author ???
* @since 2020. ?. ?
*/
@Configuration
public class WfoXmlConfig {
@Bean
public View xmlView() {
return new MarshallingView(jhaxb2Marshaller());
}
@Bean
public Jaxb2Marshaller jhaxb2Marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
Map<String,Object> map = new HashMap<String,Object>();
map.put("jaxb.formatted.output", true);
map.put("com.sun.xml.bind.namespacePrefixMapper", new ManifestNamespaceMapper());
marshaller.setMarshallerProperties(map);
marshaller.setClassesToBeBound(WfoCriteo.class);
return marshaller;
}
@Bean
public ViewResolver viewResolver() {
return new BeanNameViewResolver();
}
private class ManifestNamespaceMapper extends NamespacePrefixMapper {
private Map<String, String> prefixMap = new HashMap<String, String>();
public ManifestNamespaceMapper() {
prefixMap.put("http://base.google.com/ns/1.0", "g");
}
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion,
boolean requirePrefix) {
return prefixMap.get(namespaceUri);
}
}
}
|
cs |
소스를 간략 하게 설명을 하자면
NamespacePrefixMapper를 참조한 새로운 매퍼를 만들고 prefix 메서드를 Override 해서 내가 사용하고 싶은
네임스페이에 프리픽스를 변경해주는 형식이다.
빈등 록을 위와 같이 하고 나서 도메인 설정에 아래와 같이 처리하면
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import lombok.Data;
import javax.xml.bind.annotation.*;
/**
* ??? Domain
* @author ???
* @since 2020. ?. ?
*/
@SuppressWarnings("serial")
@XmlRootElement(name = "rss", namespace = "http://base.google.com/ns/1.0")
@XmlAccessorType(value = XmlAccessType.FIELD)
@Data
public class WfoCriteo{
private String title;
private String link;
private String description;
private String item;
@XmlElement(name="g:id")
private String gId;
@XmlElement(name="g:title")
private String gTitle;
@XmlElement(name="g:google_product_category")
.
.
.
}
|
cs |
아래와 같이 네임스페이스에 따른 프리픽스가 변경이 된다.
근데 rootElement에도 prefix가 붙는 건 왜 그런 거지...
또 정보의 바다에..