Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向WADL添加附加元素?_Java_Jaxb_Jax Rs_Cxf_Wadl - Fatal编程技术网

Java 如何向WADL添加附加元素?

Java 如何向WADL添加附加元素?,java,jaxb,jax-rs,cxf,wadl,Java,Jaxb,Jax Rs,Cxf,Wadl,我尝试将错误对象添加到响应中(使用)。它工作正常,但我还想将我的错误对象的方案添加到自动生成的WADL中 代码: JAX-B模型类: @XmlRootElement(namespace = "http://www.test.com/test") @XmlAccessorType(value = XmlAccessType.FIELD) public class UnprocessableEntityError { @XmlElement private String key;

我尝试将错误对象添加到响应中(使用)。它工作正常,但我还想将我的错误对象的方案添加到自动生成的WADL中

代码:

JAX-B模型类:

@XmlRootElement(namespace = "http://www.test.com/test")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class UnprocessableEntityError {

    @XmlElement
    private String key;

    public String getKey() {
        return key;
    }

    public void setKey(final String key) {
        this.key = key;
    }
}

@XmlRootElement(namespace = "http://www.test.com/")
public class TestModel {
}
JAX-RS资源类:

@Path("test")
public class TestResource {

    @POST
    public TestModel doSomething() {
        throw new WebApplicationException("Error", Response.status(422).entity(new UnprocessableEntityError()).build());
    }
}
CXF配置:


WADL:



有没有办法在自动生成的WADL的语法中添加一个额外的元素(仅用于文档编制)?

您可以自定义WADL自动生成,但不是很灵活。一般的CXF文档是有用的,但没有帮助

区域中,可以包括自定义XSD或链接XSD

在CXF spring文件中定义一个
WadlGenerator
,并包含在jaxrs提供程序中。例如books.xsd

<jaxrs:server address="/rest" id="test" >
    <jaxrs:providers>
        <ref bean="wadlGenerator" />
    </jaxrs:providers>
</jaxrs:server>

<bean id="wadlGenerator" class="org.apache.cxf.jaxrs.model.wadl.WadlGenerator">
    <property name="schemaLocations" value="classpath:/books.xsd"/>
</bean>
生成的WADL如下所示

<application xmlns="http://wadl.dev.java.net/2009/02" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <grammars>
       <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://superbooks" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://superbooks">
         <xs:element name="thebook" type="tns:book"/>
         <xs:complexType name="book">
            <xs:sequence>
                <xs:element minOccurs="0" name="chapter" type="xs:string"/>
                <xs:element name="id" type="xs:int"/>
            </xs:sequence>
         </xs:complexType>
      </xs:schema>
</grammars>
在spring配置中设置WadlGenerator

<bean id="wadlGenerator" class="com.wadl.CustomWadlGenerator">
    <property name="externalLinks" value="http://books"/> 
</bean>


包含定义为的XSD是否对您有效?test.xsd“/>(带有指向外部xsd或内联定义的链接)@pedrofb:我怎么能包含XSD?有任何注释或配置属性吗?不幸的是,属性
外部链接
没有按照我的需要工作。CXF添加了链接,但从现有生成的方案中删除了所有其他元素。与属性
方案定位
的问题相同,CXF用新的XSD替代了语法将新XSD添加到生成的语法中是一个错误。这样的解决方案是可以接受的?
规范允许这样做。
WadlGenerator
不支持这一点,但代码似乎很容易更新。如果它适合您,我可以尝试
WadlGenerator。createSchemaWriter
受保护,因此可以重写它在子类中组合
ExternalSchemaWriter
和默认编写器。
<bean id="wadlGenerator" class="org.apache.cxf.jaxrs.model.wadl.WadlGenerator">
    <property name="externalLinks" value="http://books"/> 
</bean>
<grammars>
    <include href="http://books"/>
</grammars>
<grammars>
    <include href="http://books"/>
    <!-- The autogenerated grammar-->
</grammars>
package com.wadl;

import java.net.URI;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;

import javax.ws.rs.core.UriInfo;
import javax.xml.bind.JAXBContext;

import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.jaxrs.model.ResourceTypes;
import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;

public class CustomWadlGenerator extends WadlGenerator {
    private List<URI> externalSchemaLinks;
    private static final Logger LOG = LogUtils.getL7dLogger(CustomWadlGenerator.class);

    //Overwrite setExternalLink so that it is not used in the superclass
    @Override
    public void setExternalLinks(List<String> externalLinks) {
        externalSchemaLinks = new LinkedList<URI>();
        for (String s : externalLinks) {
            try {
                String href = s;
                if (href.startsWith("classpath:")) {
                    int index = href.lastIndexOf('/');
                    href = index == -1 ? href.substring(9) : href.substring(index + 1);

                }
                externalSchemaLinks.add(URI.create(href));
            } catch (Exception ex) {
                LOG.warning("Not a valid URI : " + s);
                externalSchemaLinks = null;
                break;
            }
        }
    }


    private class ExternalSchemaWriter implements WadlGenerator.SchemaWriter {

        private List<URI>links;
        private UriInfo uriInfo;
        private SchemaWriter writer;

        public ExternalSchemaWriter(List<URI>links, UriInfo ui, SchemaWriter writer){
            this.links = links;
            this.uriInfo = ui;
            this.writer = writer;
        }
        public void write(StringBuilder sb) {
            //write links
            for (URI link : links) {
                try {
                    URI value = link.isAbsolute() ? link : uriInfo.getBaseUriBuilder().path(link.toString()).build(new Object[0]);

                    sb.append("<include href=\"").append(value.toString()).append("\"/>");
                } catch (Exception ex) {
                     CustomWadlGenerator.LOG.warning("WADL grammar section will be incomplete, this link is not a valid URI : " + link.toString());
                }
            }

           //concat with default writer
            writer.write(sb);
        }
    }   

    @Override
    protected SchemaWriter createSchemaWriter(ResourceTypes resourceTypes, JAXBContext context, UriInfo ui)  {
        SchemaWriter schemaCollectionWriter = super.createSchemaWriter(resourceTypes, context, ui);

        if (externalSchemaLinks == null){
            //default behaviour
            return schemaCollectionWriter;
        } else {
            //use custom writer
            return new ExternalSchemaWriter(externalSchemaLinks,ui,schemaCollectionWriter);
        }
    }
}
<bean id="wadlGenerator" class="com.wadl.CustomWadlGenerator">
    <property name="externalLinks" value="http://books"/> 
</bean>