有没有办法让javax.xml有一个根元素包装器?

时间:2011-11-18 05:04:20

标签: java xml jersey

我有一个Jeresey应用程序。我有几个资源使用带有javax.xml注释的bean作为提供者,因此结果以xml或json的形式返回,具体取决于在接受头中发送的内容,xml是默认值。一切正常。现在,我需要为每个响应添加一个根元素。

以下是资源使用数据设置并返回结果的示例提供者Bean。

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "error")
public class ErrorProvider {


private String errorCode;
private String errorMessage;

public ErrorProvider(){}

public ErrorProvider(final String errorCode,final String errorMessage){
    setErrorCode(errorCode);
    setErrorMessage(errorMessage);
}

@XmlAttribute(name = "number")
public String getErrorCode() {
    return errorCode;
}

public void setErrorCode(final String errorCode) {
    this.errorCode = errorCode;
}

@XmlElement
public String getErrorMessage() {
    return errorMessage;
}

public void setErrorMessage(final String errorMessage) {
    this.errorMessage = errorMessage;
}
}

资源方法的生成注释是:

@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})

因此默认返回是XML格式,除非在请求的accept标头中定义了json。就像我说的,这很好。它返回如下内容:

<error code="100">
    <errorMessage>An error occurred</errorMessage>
</error>

好的,足够的背景,现在有问题。我需要为所有这些提供程序添加一个根元素,这对所有提供程序都是一样的。所以它看起来像这样:

<transaction>
    <status>ok</status>
    <error code="100">
        <errorMessage>An error occurred</errorMessage>
    </error>
</transaction>

在类级别拥有像@XmlElementWrapper这样的东西会很酷。我尝试创建另一个用javax.xml注释的bean,并尝试扩展它,尝试做一个泛型bean。我只是想不出来。我能做的最好的事情是在错误XML中包含事务注释,就像它是另一个元素一样。我知道我可以编辑每个提供者bean以包含事务根元素,但我认为应该有一种方法来创建一次并应用于每个提供者bean。

1 个答案:

答案 0 :(得分:0)

您可以添加一个ContainerResponseFilter,它使用Transaction对象包装您的响应。这就是它的样子(未经测试):

public class MyFilter implements ContainerResponseFilter {
    @Override
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
        response.setEntity(new Transaction(response.getEntity()));
        return response;
    }
}

您可以在此处找到有关如何注册过滤器的更多信息:http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/api/container/filter/package-summary.html