[jboss-user] [JBoss Web Services] - @XMLElement(required = true) Validation
Vincenzo Esposito
do-not-reply at jboss.com
Thu Apr 14 06:48:07 EDT 2011
Vincenzo Esposito [http://community.jboss.org/people/vesposito] created the discussion
"@XMLElement(required = true) Validation"
To view the discussion, visit: http://community.jboss.org/message/600002#600002
--------------------------------------------------------------
Dear Community,
before anything thanks for all support.
Configuration:
JBoss 4.2.3.GA
JBossWS Native 3.1.0.GA
+I'm just developing a simple test usingWebService. I have some constraints to be applied to service’s parameters. In particular I’m looking for away to assure that the service provider receives only requests with valid input parameters.+
This is the service code:
TestService Interface
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import org.jboss.wsf.spi.annotation.WebContext;
@WebContext(contextRoot="/TestService")
@WebService
@SOAPBinding(style= Style.DOCUMENT, parameterStyle = ParameterStyle.WRAPPED)
public interface TestService {
@WebMethod
public void sendInfo(TestObject to);
}
TestServiceBean
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import org.jboss.wsf.spi.annotation.WebContext;
@WebContext(contextRoot="/Test-Service")
@WebService(serviceName="TestService", endpointInterface="testing.TestService")
@Stateless
public class TestServiceBean implements TestService {
@WebMethod
public void sendInfo(TestObject to) {
System.out.println(to.get_data());
System.out.println(to.get_key());
}
}
TestObject Class
import javax.xml.bind.annotation.XmlElement;
public class TestObject {
private String _data;
private int _key;
@XmlElement(name = "_data", required = true)
public String get_data() {
return _data;
}
public void set_data(String _data) {
this._data = _data;
}
public int get_key() {
return _key;
}
public void set_key(int _key) {
this._key = _key;
}
}
+As you can see by code, analyzing TestObject class, Idecided that the "_data" attribute should be necessarly required and it must be not “nillable”. Once deployed, the generated WSDL is this one:+
TestServiceBean.wsdl
<definitions name="TestService" targetNamespace="http://testing/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://testing/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<types>
<xs:schema targetNamespace="http://testing/" version="1.0" xmlns:tns="http://testing/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sendInfo" type="tns:sendInfo"/>
<xs:element name="sendInfoResponse" type="tns:sendInfoResponse"/>
<xs:complexType name="sendInfo">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="tns:testObject"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="testObject">
<xs:sequence>
<xs:element name="_data" type="xs:string"/>
<xs:element name="_key" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="sendInfoResponse">
<xs:sequence/>
</xs:complexType>
</xs:schema>
</types>
<message name="TestService_sendInfoResponse">
<part element="tns:sendInfoResponse" name="sendInfoResponse"/>
</message>
<message name="TestService_sendInfo">
<part element="tns:sendInfo" name="sendInfo"/>
</message>
<portType name="TestService">
<operation name="sendInfo" parameterOrder="sendInfo">
<input message="tns:TestService_sendInfo"/>
<output message="tns:TestService_sendInfoResponse"/>
</operation>
</portType>
<binding name="TestServiceBinding" type="tns:TestService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="sendInfo">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="TestService">
<port binding="tns:TestServiceBinding" name="TestServiceBeanPort">
<soap:address location="http://127.0.0.1:8180/Test-Service/TestServiceBean"/>
</port>
</service>
</definitions>
+Just analyzing the WSDL, I don't see anything about the "required" element, but using "wsconsume" tool I can obtain stubs to use client side. In detail, this is the generated TestObject stub+
Generated TestObject Stub detail
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "testObject", propOrder = {
"data",
"key"
})
public class TestObject {
@XmlElement(name = "_data", required = true)
protected String data;
@XmlElement(name = "_key")
protected int key;
.....
}
+The generated Stub contains the"required" constraint over the "_data" attribute.+
++
+In order to be consistent, I think that if Itry to use the TestObject omitting the "_data" value, JBossWS should not allow the service request. This is the client main method using to request the service.+
Main class
public static void main(String[] args) {
TestService_Service srv = new TestService_Service();
TestService test_srv = srv.getTestServiceBeanPort();
TestObject to = new TestObject();
to.setKey(3);
test_srv.sendInfo(to);
}
*+Running the client, it will perform the request without any Exception on its side and the "null" value for the "_data"attribute is received by service implementation.+*
++
+Now, what's wrong with the code? Is there anyexplaination about this issue? Why the WSDL do not contains the contraints over the "_data" value? Is there any validation before the SOAPMessage send?+
++
+Thank you for support again.+
++
+Vincenzo+
--------------------------------------------------------------
Reply to this message by going to Community
[http://community.jboss.org/message/600002#600002]
Start a new discussion in JBoss Web Services at Community
[http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2044]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20110414/f66a3472/attachment-0001.html
More information about the jboss-user
mailing list