当前位置: 首页 > 知识库问答 >
问题:

生成的 jersey rest 响应 xml 的命名空间前缀

姚凯歌
2023-03-14

我正在从jaxb模型生成rest响应(使用Jersey)。对于某些响应,生成的XML将名称空间前缀(ns2)添加到名称空间属性中,尽管它们都存在于同一个名称空间中。但对其他人来说,这完全没问题。

根据我的分析,我认为当一个复杂元素(另一个jaxb模型)在其中使用时会发生这种情况。但所有这些模型都在package-info.java中的相同名称空间中声明。

这是代码。

XYZModel.class

package int.xyxp.model;

@XmlType(name="xyztype")
@XmlRootElement(name="xyz")
@XmlSeeAlso({XModel.class, YModel.class, Z.class})
@XmlAccessorType(XmlAccessType.FIELD)
public class XYZModel extends VModel {

    @XmlElement(name="code")
    private String code;

    @XmlElementWrapper(name="refs",  namespace="http://reference.com/ref")
    @XmlElementRef
    private List<XModel> refs = new ArrayList<XModel>(0); 
//continues

package-info.java

@javax.xml.bind.annotation.XmlSchema( 
    namespace = "http://reference.com/ref",    
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package int.xyxp.model;

生成的XML

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<ns2:xyz version="1.0" xmlns:ns2="http://reference.com/ref">
    <ns2:code>15</ns2:code>
    <ns2:refs/>
</ns2:xyz>

应为XML(无前缀,采用默认命名空间)。

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<xyz version="1.0" xmlns="http://reference.com/ref">
    <code>15</code>
    <refs/>
</xyz>

任何想法。谢了。

[编辑]

在我尝试插入我的首选名称空间前缀之后,它甚至不起作用。所以可能是包裹信息。java仅用于名称空间,而不用于选择名称空间前缀。

package-info.java

 @javax.xml.bind.annotation.XmlSchema( 
           namespace = "http://reference.com/ref",    
    xmlns = { 
      @javax.xml.bind.annotation.XmlNs(prefix = "ref", namespaceURI = "http://reference.com/ref"), 
    }, 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
 package int.xyxp.model;

共有1个答案

郎建章
2023-03-14

注意:我已覆盖 MessageBodyWriter 以提供我自己的命名空间(“my”)。即使我返回了空的“”,它默认在空时采用ns2。因此,如果您希望拥有自己的命名空间而不是默认的“ns2”,则此答案有效。

import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.Providers;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;

@Produces(value=MediaType.APPLICATION_XML)
public class WSNamespaceWriter implements MessageBodyWriter<Object>{

    @Context
    protected Providers providers;

    public boolean isWriteable(Class<?> type, Type genericType,
        Annotation[] annotations, MediaType mediaType) {
        System.out.println("Calling MessageWriter writetable--> " + type.getName());
        return true;
    }

    public void writeTo(Object object, Class<?> type, Type genericType,
        Annotation[] annotations, MediaType mediaType,
        MultivaluedMap<String, Object> httpHeaders,
        OutputStream entityStream) throws IOException,
        WebApplicationException {
        try {
            System.out.println("Calling MessageWriter-->");
            ContextResolver<JAXBContext> resolver 
                = providers.getContextResolver(JAXBContext.class, mediaType);
            JAXBContext jaxbContext;
            if(null == resolver || null == (jaxbContext = resolver.getContext(type))) {
                jaxbContext = JAXBContext.newInstance(type);
            }
            Marshaller m = jaxbContext.createMarshaller();
            NamespacePrefixMapper mapper = new NamespacePrefixMapper() {
                public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
                    System.out.println ("Called NAMESPACE----------" + namespaceUri);
                    if ("http://www.example.com".equals(namespaceUri)
                            || ("").equals(namespaceUri)) {
                        System.out.println ("Called NAMESPACE  return --------");
                        return "my"; // my own namespace
                    }   
                    System.out.println ("Called NAMESPACE  return ns--------");
                    return "";
                }
            };
            m.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", mapper);           
            m.marshal(object, entityStream);
        } catch(JAXBException jaxbException) {
            throw new WebApplicationException(jaxbException);
        }
    }

    public long getSize(Object t, Class<?> type, Type genericType,
        Annotation[] annotations, MediaType mediaType) {
        return -1;
    }

}
 类似资料:
  • 主要内容:命名冲突,使用前缀来避免命名冲突,XML 命名空间 - xmlns 属性,统一资源标识符(URI,全称 Uniform Resource Identifier),默认的命名空间,实际使用中的命名空间XML 命名空间提供避免元素命名冲突的方法。 命名冲突 在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。 这个 XML 携带 HTML 表格的信息: <table> <tr> <td>Apples</td> <td>Bananas</td> <

  • 问题内容: 我正在使用JQuery执行Web服务调用,它是ajax函数,无法解析返回的数据。当我警告数据(alert($(data).find(“ return”)。text())为空时,我看到服务器响应xml数据,如下所示,当我警告(数据)时,我得到了[object XMLDocument给定我的XML结构并在下面使用命名空间,txt = $(data).find(“ return”)。text

  • 我正在使用 JAXB 来对我正在实现 Java 客户端的 Web 服务进行封送和解组和取消马歇尔请求和响应。然而,我被困在以下回应上,我需要解体。 为了将响应表示为Java对象,我有以下域类: 然后,我执行以下操作来解除元帅: 解编组没有发生任何事件。 对象是使用两个列表创建的。为空,有一项。但是,该项目上的和 null。我认为这与XML命名空间有关,但我无法弄清楚如何修复它。 我尝试了另一种方式

  • 尝试基于两个唯一的字符串生成客户端Id。这应该与服务器中从相同的ID生成的UUID相同。 使用Javascript,它看起来像这样: 似乎找不到在Swift上生成这个的方法,NSUUID只能从无到有生成UUID 我正在寻找这样的东西: 编辑 例:

  • 我试图使用jaxb解组一个soap响应。 我尝试使用以下代码查找根元素 这是我的样本回复 我能够获取对象,但当我尝试访问中的时,由于前缀 有人能帮我脱身吗? 更新:有人能帮我吗? 我使用stax xml解析器解析为,但我将其中的所有值都视为null。

  • 我们正在创建一个可以支持XML和JSON格式的Spring boot REST服务。我们使用这里描述的相同方法:接受/返回XML/JSON请求和响应- Spring MVC 除了我们需要在XML响应中有一个名称空间之外,它大部分都是有效的,目前响应XML没有任何名称空间。我们尝试在DTO类中添加以下内容,并尝试创建“package info.java”。两者都不起作用。有人有什么建议吗? @jav