Tôi có một phần tử được định nghĩa là xsd: double. Nếu tôi thử và đặt một giá trị nói 285 vào phần tử và sau đó tôi sắp xếp nó, tôi nhận được một đầu ra là 285.0 ... Điều đó là tốt. Tuy nhiên, nếu tôi đặt một giá trị nói 285292746, tôi nhận được kết quả là 2.85292746E8 khi Tôi sắp xếp. Tôi thích một cái gì đó để sản lượng tăng gấp đôi không được chuyển đổi thành ký hiệu khoa học với số thập phân? Về cơ bản tôi muốn 285292746 hoặc 2852292746.0000000Jaxb: Chuyển đổi Loại Kết nối Đôi toàn cầu Sử dụng XMLAdapter
java.lang.Double.toString() sử dụng "ký pháp khoa học trên máy vi tính" cho các giá trị nhất định tạo ra các giá trị cho xml.
Tôi biết đại diện kép của giá trị đã cho là tốt. Nhưng thực tế giá trị theo định dạng số mũ, Hệ thống mà tôi đang làm là chấp nhận XML của tôi nhưng không biết phải làm gì với giá trị mũ và làm cho chương trình của tôi không hoạt động chính xác. Thay đổi xsd: loại gấp đôi trong WSDL hoặc máy chủ không khả thi đối với tôi. Tôi đang làm việc ở phía khách hàng.
Tôi gặp Jaxb: ràng buộc cho xsd: double type. Tôi vẫn còn có thời gian khó khăn để khắc phục vấn đề để gửi giá trị gấp đôi giá trị ở định dạng không phải số mũ.
package com.logger.client
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.DatatypeConverter;
public class JaxbDoubleSerializer extends XmlAdapter<String, Double>
{
public Double unmarshal(String value) {
return ((double)javax.xml.bind.DatatypeConverter.parseDouble(value));
}
public String marshal(Double value) {
if (value == null) {
return null;
}
return (javax.xml.bind.DatatypeConverter.printDouble((double)(double)value));
}
}
Tôi cần trợ giúp cách sử dụng DoubleSerializer để tôi có thể chuyển các giá trị không có số mũ. Tôi đã thử sử dụng chú thích xmlAdapter trong lớp MyLogClient.java của tôi. Tôi cần phải biết làm thế nào tôi có thể giải quyết tình trạng này.
package com.logger.client
import javax.xml.ws.BindingProvider;
import javax.xml.bind.JAXBElement;import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;
public class MyLogClient
{
//Private member fields
/** Object factory used to create user-and-role specific objects. */
private static final ObjectFactory _of = new ObjectFactory();
@XmlJavaTypeAdapter(JaxbDoubleSerializer.class)
public JAXBElement<Double> msgFileId;
@XmlJavaTypeAdapter(JaxbDoubleSerializer.class)
public Double dNumber;
public final void createEntry;
(
final String userName,
final String time,
final String logMsgStringId,
final Params logMsgParamsVal,
final Integer logMessageFieldID
)
throws JAXBException
{
JAXBElement<String> username = _of.createParamsParam(userName);
JAXBElement<String> strTime = _of.createLogRequestTime(time);
// Build the LogRequest request.
final LogRequest _LogRequest = _of.createLogRequest();
_LogRequest.setUserName(userName);
_LogRequest.setTime(strTime);
//Following is the main problem
int nMsgArgs = 285292746;
dNumber = Double.parseDouble(Integer.toString(nMsgArgs));
//After parsing double Value I get dNumber is now 2.85292746E8
//MsgFile Id is of Type JAXBElement<Double>
//CreateLogMessageIdentifier takes Double param
//So the main problem is here..the value of double field in soap request
//is being sent in exponential format. I need to send as I explained above
//285292746.
msgFileId = _of.createLogMessageIdentifier(dNumber);
JAXBElement<String> strIdVal = _of.createLogMessageFileId(logMsgStringId);
final LogMessage logMessage = _of.createLogMessage();
JAXBElement<Params> _logMsgParams =_of.createLogMessageParams(logMsgParamsVal);
//Following is where I am trying to use marshall for double type.
JAXBContext context = JAXBContext.newInstance("package com.logger.client ");
context.createMarshaller().marshal(msgFileId, System.out);
logMessage.setIdentifier(msgFileId); //Method takes JAXBElement<Double>
logMessage.setFileId(strIdVal);
logMessage.setParams(_logMsgParams);
JAXBElement<LogMessage> logMsgValue = _of.createLogRequestLogMessage(logMessage);
_LogRequest.setLogMessage(logMsgValue);
// Set the log entry
port.log(_LogRequest); //Request is sent to server.
}
WSDL xsd: khai báo kiểu là dưới đây: -
<xsd:complexType name="LogMessage">
<xsd:sequence>
<xsd:element name="fileId" type="xsd:string" minOccurs="0" nillable="true" />
<xsd:element name="identifier" type="xsd:double" minOccurs="0" nillable="true" />
<xsd:element name="params" type="tns:Params" minOccurs="0" nillable="true" />
</xsd:sequence>
</xsd:complexType>
Output cho lĩnh vực nhận dạng là: -
<identifier> 2.85292746E8</indentifier>
Whereas I want to send as. Because system does accept/recognize following types.
<identifier> 285292746</indentifier>
or
<identifier> 285292746.00000000</indentifier>
Bạn có đưa ra một số ví dụ cụ thể không? Bạn có nghĩ rằng tùy chọn bộ điều hợp xml là tốt. Tôi đã cố gắng sử dụng như được hiển thị ở trên trong ví dụ của tôi JAxDouble Serialzer nhưng không chắc chắn những gì tôi đang mất tích. – user1029083