Java:JAX-WS Mapping

我正在使用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 ) 

这是我得到的类型映射:

               

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

更新:

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

        

但我认为问题是最后的合同 (例如,编写生成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限制的方法,但我可能错了

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

使用适配器,如:

 import javax.xml.bind.annotation.adapters.XmlAdapter; public class CharAdapter extends XmlAdapter { @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,例如:

   weather character info blah blah      

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