2011-08-30 43 views
11

Tôi đang sử dụng JAX-WS cho các dịch vụ web.Java: JAX-WS Ánh xạ

Bất cứ khi nào tôi sử dụng char làm tham số phương thức, tôi nhận nó dưới dạng unsignedShort trong xsd (Tập trung vào weatherLetter).

Đây là tuyên bố:

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

Đây là ánh xạ loại I nhận được:

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

Làm thế nào tôi có thể nhận được weatherLetter để tạo ra như một Char hoặc 1 Letter String hoặc một cái gì đó?

+0

Có đồ chơi cố gắng thay đổi nó từ char vào String trong khai báo? – 8vius

+0

Ngoài ra nếu bạn có thể đăng một số mã phía máy chủ để xem những gì nó gửi sẽ là tốt. – 8vius

+0

Không đẩy, nhưng nếu bạn tìm thấy câu trả lời được chấp nhận, hãy đánh dấu câu trả lời là một :) –

Trả lời

10

Cập nhật:

Một cách để làm điều này là trong XSD (nếu bạn làm hợp đồng đầu tiên) ví dụ thêm trực tiếp số XSD Restriction vào, ví dụ:

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

Nhưng tôi nghĩ rằng câu hỏi là trên hợp đồng cuối cùng (ví dụ như viết mã mà tạo ra XSD, không phải ngược lại)

này chưa được hỗ trợ trong JAX-WS hoặc JAXB, như xa như tôi biết (nhưng yêu cầu tăng cường thoải mái)

Nguồn:

JAX-WS và JAXB không có hỗ trợ cho việc tạo mã cho những hạn chế từ XSD (ví dụ xsd: r estriction) http://old.nabble.com/Does-jaxb-2.1-enforce-xs:restriction-td21348458.html

Lý do là theo một hướng khác (tạo ra hạn chế bởi Annotation), không được hỗ trợ quá

Cách giải quyết:

Hãy xem này: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html

Và cũng tại câu hỏi này:

JAX-WS and Joda-Time?

Không làm chính xác những gì bạn muốn, nhưng nhận bạn một chút gần gũi hơn


Tôi không nghĩ rằng bạn có thể có nó hạn chế đến 1 char bất kỳ cách nào khác, một char thực sự là một unsigned ngắn, và điều gần nhất bạn có thể giới hạn để 1 "String" char.

Nếu bạn sử dụng Chuỗi, bạn sẽ cho phép các ký tự không giới hạn. và @WebParam không có một API để hạn chế chiều dài

Thật sự tôi không thấy một cách để làm hạn chế XSD ở tất cả sử dụng JAX-WS, nhưng tôi có thể sai

1

Bạn nên cố gắng thay đổi nó từ char để String trong tuyên bố của bạn nếu bạn muốn nhận được chỉ là một nhân vật duy nhất, nếu bạn đang lập trình phía khách hàng không nên có nhiều rắc rối khi làm như vậy

5

Sử dụng một bộ chuyển đổi, một cái gì đó như:

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

} 

Và sau đó trong WXStatus của bạn (xác định một lớp duy nhất như là đối số đầu vào thay vì qua ing trong vô số các thông số cá nhân - JAX đã được chuyển sang dạng complexType vì vậy bạn có thể là tốt, cộng với đó là một phong cách OOP tốt hơn), thêm chú thích này (một trong hai lĩnh vực hoặc getter):

@XmlJavaTypeAdapter(CharAdapter.class) 
char weatherLetter; 

này sẽ cho phép un/marshalling trên phía máy chủ của bạn và khách hàng sẽ thấy nó như là một xs: string. Một hiệu ứng phụ là khi chúng ta đang sử dụng wrapper nguyên thủy cho char, bạn sẽ phải xử lý null.

CẬP NHẬT EDIT: Tôi không nghĩ rằng có bất kỳ cách nào bạn có thể xác định độ dài của chuỗi với điều này, mặc dù không bằng tay tạo/chỉnh sửa WSDL của bạn với một cái gì đó như:

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

+1 - Tôi là người lãnh đạo Eclipse JAXB (MOXy), và đây chính xác là những gì tôi đã đề xuất. –

+1

@Blaise - Bạn có nói rằng chú thích '@ XsdRestriction' là một yêu cầu nâng cao hợp lệ không? nó bị mất từ ​​XSD sang Bean, có vẻ như là một khoảng trống với tôi, làm sao người ta có thể biết được nó có nằm trong lộ trình cho JAXB không? – ruchirhhi

+1

@ruchirhhi - Một yêu cầu chung là sử dụng chú thích Xác thực Bean (JSR-303) để hạn chế. Cách tốt nhất để tiếp tục là bạn thêm yêu cầu tính năng với triển khai cá nhân (Metro: http://java.net/jira/browse/JAXB/, MOXy: https://bugs.eclipse.org/bugs/enter_bug .cgi? product = EclipseLink). –

Các vấn đề liên quan