有没有办法用javax.xml创建根元素包装器?

有没有办法用javax.xml创建根元素包装器?,java,xml,jersey,Java,Xml,Jersey,我有一份Jeresey的申请表。我有几个资源使用带有javax.xml注释的bean为提供者进行注释,因此结果以xml或json的形式返回,具体取决于在默认值为xml的accept标头中发送的内容。一切都很好。现在,我需要为每个响应添加一个根元素 下面是一个示例提供程序Bean,资源使用数据设置它并返回结果 import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; imp

我有一份Jeresey的申请表。我有几个资源使用带有javax.xml注释的bean为提供者进行注释,因此结果以xml或json的形式返回,具体取决于在默认值为xml的accept标头中发送的内容。一切都很好。现在,我需要为每个响应添加一个根元素

下面是一个示例提供程序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})
因此,除非在请求的accept头中定义了json,否则默认返回是XML格式的。就像我说的,这个很好用。它返回如下内容:

<error code="100">
    <errorMessage>An error occurred</errorMessage>
</error>
<transaction>
    <status>ok</status>
    <error code="100">
        <errorMessage>An error occurred</errorMessage>
    </error>
</transaction>
好了,背景已经讲够了,现在是问题。我需要向所有这些提供者添加一个根元素,这对所有提供者都是一样的。所以看起来是这样的:

<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。

您可以添加一个ContainerResponseFilter,它使用事务对象包装您的响应。这就是未经测试的情况:

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

您可以在此处了解有关如何注册筛选器的更多信息:

您不能创建一个名为Transaction的Bean,其中包含字段状态和另一个ErrorProvider类型的字段错误,并适当添加注释吗,我猜您正在寻找@XmlType,但我不确定是否理解您的提问人-我想到了这一点,它在一个案例中运行得相当好,但我需要使用多个提供者bean,因此在主事务bean中有多个提供者类型字段不是一个可行的解决方案。我将进一步研究XmlType,当我读到它的时候,它似乎并没有达到我想要的效果。所有的提供者bean都工作得很好-我只需要在返回时将它们封装在一个标准元素中-希望这会有所帮助..听起来很有希望。听起来好像资源方法的响应会被过滤掉,在那里我可以应用标准的包装器元素。我来试一试,没错,你会有一个用XmlRootElement注释的事务bean,当过滤器被调用时,它会修改响应,这样它就可以用事务对象包装当前实体。因此,一旦泽西试图马歇尔,它应该吐出正确的东西。确保你的事务类有一个公共默认构造函数,以及一个接受你想要包装的类型的构造函数。在传递给事务构造函数时,上面的代码应该转换为该类型。这实际上非常有效,我认为这是更好的方法。我希望过滤器用于每个响应,但实体可以是任何提供者bean的实例。这是我能做到的唯一方法。为实体可能是的每个提供者bean在事务bean上定义一个属性。在筛选器上,检查实体的实例并正确地强制转换它。有没有办法把整个过程都老龄化?我不确定如何设置事务bean以了解它可能需要处理的不同类型。