gpt4 book ai didi

java - @XmlTransient 用于序列化但不用于反序列化?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:25 26 4
gpt4 key购买 nike

有没有一种方法可以配置 @XmlTransient JPA2.0 注释,它只会在 Java 对象序列化为 xml 时阻止 JAXB 机制,而不是在传入的 XML 转换为 java 对象时阻止 JAXB 机制?

背景:我有一个使用 XML 的 REST api。有一个端点可以创建新的附件对象。正如我们所说的附件,这个类中有一个 byte[] 字段。在进一步的附件列表中,我不想提供每个附件的 byte[] 内容。

@Entity
@XmlRootElement
public class Attachment {

private String name;

private String mimeType;

private byte[] dataPart;

public String getName() {
return name;
}

public void setName( String name ) {
this.name = name;
}

public String getMimeType() {
return mimeType;
}

public void setMimeType( String mimeType ) {
this.mimeType = mimeType;
}

public byte[] getDataPart() {

return dataPart.clone();
}

public void setDataPart( byte[] dataPart ) {
this.dataPart = dataPart.clone();
}
}

因此,当我用 XmlTransient 标记 getDataPart() 时,传入 byte[] 的数据将被忽略并设置为 null -> 它丢失了。有人知道如何指定 XmlTransient 的方向吗?

最佳答案

我必须自己回答这个问题 =)我通过使用自定义 XmlAdapter 解决了这个问题,它只在一个方向上转换二进制数据。这仍然是一个 hack,我们不再使用它了。原因如下。

这是适配器:

public class DuplexBase64MarshallAdapter extends XmlAdapter<String, byte[]> {

/**
* running the adapter in half duplex mode means, the incoming data is marshaled but the
* outgoing data not.
*/
public static final boolean HALF_DUPLEX = false;

/**
* Running the adapter in full duplex means, the incoming and outgoing data is marshalled.
*/
public static final boolean FULL_DUPLEX = true;

private boolean isFullDuplexMode;

public DuplexBase64MarshallAdapter() {
this.isFullDuplexMode = HALF_DUPLEX;
}

/**
* Constructor
*
* @param fullDuplex
* use {@link #HALF_DUPLEX} or {@link #FULL_DUPLEX}
*/
public DuplexBase64MarshallAdapter( boolean fullDuplex ) {
this.isFullDuplexMode = fullDuplex;
}

@Override
public byte[] unmarshal( String v ) throws Exception {
return Base64.decode( v );
}

/**
* Return always an empty string. We do not want to deliver binary content here.
*/
@Override
public String marshal( byte[] v ) throws Exception {
if( isFullDuplexMode ) {
return Base64.encodeBytes( v );
}
return "";
}

}

实体需要使用此适配器进行注释:

@Entity
@XmlRootElement
public class Attachment {

private String name;

private String mimeType;

private byte[] dataPart;

public String getName() {
return name;
}

public void setName( String name ) {
this.name = name;
}

public String getMimeType() {
return mimeType;
}

public void setMimeType( String mimeType ) {
this.mimeType = mimeType;
}

@XmlJavaTypeAdapter( DuplexBase64MarshallAdapter.class )
public byte[] getDataPart() {

return dataPart.clone();
}

public void setDataPart( byte[] dataPart ) {
this.dataPart = dataPart.clone();
}
}

此解决方案按预期工作。但是有一个缺点:目的之一是不让 hibernate 在处理/加载附件数据时加载二进制数据。但这不是它的工作原理。在这种情况下,二进制数据由 hibernate 加载,因为它被发送到 XMLAdapter 但未转换为 base64 :(

关于java - @XmlTransient 用于序列化但不用于反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10552609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com