【问题标题】:Java: JAX-WS MappingJava:JAX-WS 映射
【发布时间】:2011-11-07 03:28:06
【问题描述】:

我正在将 JAX-WS 用于 Web 服务。

每当我使用 char 作为方法参数时,我都会将它作为 xsd 中的 unsignedShort(关注 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
) 

这是我得到的类型映射:

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

如何让 weatherLetter 生成为 Char 或 1 个字母字符串之类的?

【问题讨论】:

  • 玩具是否尝试过在声明中将其从 char 更改为 String?
  • 另外,如果您可以发布一些服务器端代码以查看它发送的内容会很好。
  • 不推送,但如果你找到一个被接受的答案,请随意将其标记为一个:)

标签: java web-services jakarta-ee jaxb jax-ws


【解决方案1】:

更新:

这样做的一种方法是在 XSD 中(如果您先先签订合同),例如直接向其添加XSD Restriction,例如

<xs:element name="singleChar">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:length value="1"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

但我认为问题在于最后的合同(例如,编写生成 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 and Joda-Time?

没有做你想做的事,而是让你更接近一点


我认为您不能以任何其他方式将其限制为 1 个字符,一个 char 确实是一个无符号短,并且您可以最接近限制为 1 个“字符串”字符。

如果您使用字符串,您将允许无限的字符。而@WebParam 没有限制长度的 API

其实我根本没有看到使用 JAX-WS 进行 XSD 限制的方法,但我可能错了

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      【解决方案3】:

      如果您只接收一个字符,您应该尝试在声明中将其从 char 更改为 String,如果您正在对客户端进行编程,那么这样做应该不会有太多麻烦

      【讨论】:

        【解决方案4】:

        使用适配器,例如:

        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);
            }
        
        }
        

        然后在您的 WXStatus 中(将单个类定义为输入参数,而不是传入大量单独的参数 - JAX 已经将其转换为 complexType,因此您也可以这样做,而且它是一种更好的 OOP 样式),添加此注释(对字段或吸气剂):

        @XmlJavaTypeAdapter(CharAdapter.class)
        char weatherLetter;
        

        这将允许在您的服务器端进行 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>
        

        【讨论】:

        • +1 - 我是 EclipseLink JAXB (MOXy) 负责人,这正是我的提议。
        • @Blaise - 你会说@XsdRestriction 注释是一个有效的增强请求吗?它从 XSD 丢失到 Bean,对我来说似乎是一个差距,如何判断它是否在 JAXB 的路线图中?
        • @ruchirhhi - 一个常见的请求是利用 Bean Validation 注释 (JSR-303) 进行限制。最好的方法是通过单独的实现添加功能请求(Metro:java.net/jira/browse/JAXB,MOXy:bugs.eclipse.org/bugs/enter_bug.cgi?product=EclipseLink)。
        猜你喜欢
        • 2014-12-31
        • 2016-09-15
        • 2011-10-25
        • 2013-12-17
        • 2014-12-06
        • 2011-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多