【发布时间】:2011-11-18 05:04:19
【问题描述】:
我有一份 Jeresey 申请。我有几个资源使用带有 javax.xml 注释的提供者注释的 bean,因此结果以 xml 或 json 形式返回,具体取决于在接受标头中发送的内容,xml 是默认值。一切正常。现在,我需要为每个响应添加一个根元素。
这是一个示例 Provider 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注解是:
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
所以默认返回是 XML,除非在请求的接受标头中定义了 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。
【问题讨论】:
-
你不能创建一个名为
Transaction的 Bean,其中包含一个字段status和另一个类型为ErrorProvider的字段error并适当地添加注释吗? -
拿a deeper at how jaxb works,我猜你在找
@XmlType,但我不确定你的问题是否理解 -
T Man - 我想到了这一点,并且在这种情况下它工作得相当好,但是我有多个 Provider bean 我需要这样做,所以拥有多个 Provider 不是一个可行的解决方案在主 Transaction bean 中键入字段。
-
我会进一步研究 XmlType,当我读到它时,它似乎并没有达到我想要的效果。所有的提供者 bean 都可以正常工作——我只需要在返回时将它们都包装在一个标准元素中——希望这会有所帮助..