2013-12-19 3 views
1

에 대한사용자 정의 시리얼 I 두 클래스 뉴스 및 NewsList</p> <p>News.class가있는 경우에만 속성이 아닌 클래스

@Entity 
@Table(name = News.TABLE_NAME) 
@NamedQueries({ 
    @NamedQuery(name = News.FIND_ALL, query = "SELECT n FROM News n"), 
    @NamedQuery(name = News.FIND_BY_SWID, query = "SELECT n FROM News n WHERE n.swId = :swId"), 
    @NamedQuery(name = News.FIND_BY_LINK, query = "SELECT n FROM News n WHERE n.link = :link"), 
    @NamedQuery(name = News.FIND_BY_LIST, query = "SELECT n FROM News n WHERE n.list = :list ORDER BY n.lastModified DESC") }) 
public class News { 

public static final String TABLE_NAME = "news"; 
public static final String ID_SEQ = "seq_news_id"; 

public static final String FIND_ALL = "News.findAll"; 
public static final String FIND_BY_SWID = "News.findBySwId"; 
public static final String FIND_BY_LINK = "News.findByLink"; 
public static final String FIND_BY_LIST = "News.findByList"; 

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ID_SEQ) 
@SequenceGenerator(name = ID_SEQ, allocationSize = 1, initialValue = 1, sequenceName = ID_SEQ) 
private long id; 

@Column(name = "swid", nullable = false, unique = true) 
private long swId; 

@Column(name = "link", nullable = false, unique = true) 
private String link; 

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "lastmodified") 
private Date lastModified; 

@Column(name = "title", nullable = false) 
private String title; 
@Column(name = "lead", nullable = false, length = 500) 
private String lead; 

@Lob 
@Basic(fetch = FetchType.LAZY) 
@Column(name = "content", nullable = true) 
private String content; 

@ElementCollection(fetch = FetchType.LAZY, targetClass = Media.class) 
@CollectionTable(name = "news_media") 
private List<Media> medias = new ArrayList<Media>(); 

@ManyToOne(fetch = FetchType.LAZY, targetEntity = NewsList.class, optional = false) 
@JoinColumn(name = "newslist_id", nullable = false) 
@JsonProperty(value = "newslist_id") 
@JsonSerialize(using = NewsListPropertySerializer.class) 
private NewsList list; 

//Getters and Setters 
} 

NewsList.class

@Entity 
@Table(name = NewsList.TABLE_NAME) 
@NamedQueries({ 
    @NamedQuery(name = NewsList.FIND_ALL, query = "SELECT nl FROM NewsList nl"), 
    @NamedQuery(name = NewsList.FIND_BY_NAME, query = "SELECT nl FROM NewsList nl WHERE nl.name = :name"), 
    @NamedQuery(name = NewsList.FIND_BY_TYPE, query = "SELECT nl FROM NewsList nl WHERE nl.type = :type"), 
    @NamedQuery(name = NewsList.FIND_BY_GROUP, query = "SELECT nl FROM NewsList nl WHERE nl.group = :group"), 
    @NamedQuery(name = NewsList.FIND_NOMAIN_GROUP, query = "SELECT nl FROM NewsList nl WHERE nl.group <> org.ewicom.pps.webservice.news.NewsListGroup.MAIN") }) 
public class NewsList { 

public static final String TABLE_NAME = "newslist"; 
public static final String ID_SEQ = "seq_newslist_id"; 

public static final String FIND_ALL = "NewsList.findAll"; 
public static final String FIND_BY_NAME = "NewsList.findByName"; 
public static final String FIND_BY_TYPE = "NewsList.findByType"; 
public static final String FIND_BY_GROUP = "NewsList.findByGroup"; 
public static final String FIND_NOMAIN_GROUP = "NewsList.finNoMainGroup"; 

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ID_SEQ) 
@SequenceGenerator(name = ID_SEQ, allocationSize = 1, initialValue = 1, sequenceName = ID_SEQ) 
private long id; 

@Column(name = "listname", nullable = false, unique = true) 
private String name; 

@Enumerated(EnumType.STRING) 
@Column(name = "listtype", nullable = false) 
private NewsListType type; 

@Enumerated(EnumType.STRING) 
@Column(name = "listgroup", nullable = false) 
private NewsListGroup group; 

@Column(name = "listlink", nullable = false, unique = true) 
private String link; 

@OneToMany(targetEntity = News.class, cascade = CascadeType.REMOVE, mappedBy = "list", fetch = FetchType.LAZY, orphanRemoval = true) 
@OrderBy("lastModified DESC") 
@JsonIgnore 
private List<News> news; 

//Getters and Setters 
} 

I 재산 목록에 대한 사용자 정의 시리얼을 추가 in news.class

public class NewsListPropertySerializer extends StdSerializer<NewsList> { 

public NewsListPropertySerializer(Class<NewsList> t) { 
    super(t); 
} 

@Override 
public void serialize(NewsList value, JsonGenerator jgen, 
     SerializerProvider provider) throws IOException, 
     JsonGenerationException { 
    jgen.writeNumber(value.getId()); 
} 
} 

Jackson이 News를 serialize 할 때 모든 것이 정상이지만 NewsList 시스템을 serialize하고 사용자 정의 serializer를 사용하여 ID 만 인쇄하려고합니다. 속성에 대해서만 serializer를 추가하는 방법.

답변

0

시리얼 라이저가 정확히 수행합니다. serialize 메서드는 NewsList를 가져 와서 id를 출력합니다. StdSerializer의 메서드 'findConvertingContentSerializer'를 보거나 JPA의 @Converter 및 @Convert 주석을 사용하여 속성에 대한 변환기를 등록하십시오.