Java:JAX-WS Mapping

mai*_*rgs 11 java web-services jax-ws jaxb java-ee

我正在使用JAX-WS进行Web服务.

每当我使用char作为方法参数时,我将它作为xsd中的unsignedShort(Focus on weatherLetter).

这是宣言:

@WebMethod
public boolean setWXtatus(
        @WebParam(name = "weatherLetter") char weatherLetter,
        @WebParam(name = "weatherDigit") int weatherDigit,
        @WebParam(name = "cloudCover") int cloudCover,
        @WebParam(name = "cloudBaseInHundredsOfFeet") int cloudBaseInHundredsOfFeet,
        @WebParam(name = "pressureInHg") int pressureInHg,
        @WebParam(name = "visibilityInKm") int visibilityInKm,
        @WebParam(name = "windSpeed") int windSpeed,
        @WebParam(name = "windDirection") int windDirection,
        @WebParam(name = "lastUpdateHour") int lastUpdateHour,
        @WebParam(name = "lastUpdateMin") int lastUpdateMin
) 
Run Code Online (Sandbox Code Playgroud)

这是我得到的类型映射:

<xs:complexType name="setWXStatus">
<xs:sequence>
<xs:element name="weatherLetter" type="xs:unsignedShort" minOccurs="0"/>
<xs:element name="weatherDigit" type="xs:int"/>
<xs:element name="cloudCover" type="xs:int"/>
<xs:element name="cloudBaseInHundredsOfFeet" type="xs:int"/>
<xs:element name="pressureInHg" type="xs:int"/>
<xs:element name="visibilityInKm" type="xs:int"/>
<xs:element name="windSpeed" type="xs:int"/>
<xs:element name="windDirection" type="xs:int"/>
<xs:element name="lastUpdateHour" type="xs:int"/>
<xs:element name="lastUpdateMin" type="xs:int"/>
</xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

如何将weatherLetter生成为Char或1 Letter String或其他内容?

Era*_*dan 10

更新:

一种方法是在XSD中(如果你先签约)例如直接添加XSD限制,例如

<xs:element name="singleChar">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:length value="1"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

但我认为问题是最后的合同(例如,编写生成XSD的代码,反之亦然)

据我所知,这在JAX-WS或JAXB中尚不支持(但是一个很好的增强请求)

资料来源:

JAX-WS和JAXB不支持XSD限制的代码生成(例如xsd:restriction) http://old.nabble.com/Does-jaxb-2.1-enforce-xs:restriction-td21348458.html

原因是不支持另一个方向(由Annotation生成限制)

解决方法:

看看这个:http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html

还有这个问题:

JAX-WS和Joda-Time?

没有做到你想要的,但让你更近一点


我不认为你可以用任何其他方式将它限制为1个字符,char确实是一个无符号的短语,并且最接近你可以限制为1个"字符串"字符.

如果您使用String,您将允许无限制的字符.和@WebParam没有用于限制长度的API

实际上我没有看到使用JAX-WS完全做XSD限制的方法,但我可能错了


Hya*_*elo 5

char和java.lang.Character要求您输入自定义映射,因为不存在从char或java.lang.Character到WSDL XSD的默认映射.

引自http://publib.boulder.ibm.com/infocenter/radhelp/v6r0m1/index.jsp?topic=%2Fcom.ibm.etools.webservice.creation.doc%2Fconcepts%2Fcsoaptover.html


ear*_*cam 5

使用适配器,如:

import javax.xml.bind.annotation.adapters.XmlAdapter;


public class CharAdapter extends XmlAdapter<String, Character> {

    @Override
    public String marshal(Character c) throws Exception
    {
        return String.valueOf(c);
    }

    @Override
    public Character unmarshal(String s) throws Exception
    {
    if(s == null) {
        return null;
    }
    if(s.length() != 1) {
        throw new IllegalArgumentException("Provided string \"" + s + 
                "\" has invalid length of " + s.length() + " should be 1");
    }
        return s.charAt(0);
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在你的WXStatus中(定义一个单独的类作为输入参数而不是传递大量的单个参数--JAX已经把它变成了一个complexType,所以你也可以加上它是一个更好的OOP样式),添加这个注释(到无论是领域还是吸气者):

@XmlJavaTypeAdapter(CharAdapter.class)
char weatherLetter;
Run Code Online (Sandbox Code Playgroud)

这将允许在服务器端进行un/marshalling,客户端将其视为xs:string.一个副作用是因为我们使用char的原始包装器,你必须处理null.

更新编辑:我认为没有任何方法可以用这个来指定字符串的长度,而无需手动创建/编辑WSDL,例如:

<xs:simpleType name="weatherLetter">
  <xs:annotation>
    <xs:documentation>weather character info blah blah</xs:documentation>
  </xs:annotation>
  <xs:restriction base="xs:string">
    <xs:length value="1"/>
  </xs:restriction>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

  • +1 - 我是EclipseLink JAXB(MOXy)的领导者,这正是我所建议的. (2认同)