diff --git a/tests/pecantest/test/controllers/ws.py b/tests/pecantest/test/controllers/ws.py
index 9036bcd..ebef4e9 100644
--- a/tests/pecantest/test/controllers/ws.py
+++ b/tests/pecantest/test/controllers/ws.py
@@ -14,6 +14,12 @@ class Author(Base):
firstname = text
books = wsattr(['Book'])
+ @staticmethod
+ def validate(author):
+ if author.firstname == 'Robert':
+ raise wsme.exc.ClientSideError("I don't like this author!")
+ return author
+
class Book(Base):
id = int
diff --git a/tests/pecantest/test/tests/test_ws.py b/tests/pecantest/test/tests/test_ws.py
index 6002796..2bc484c 100644
--- a/tests/pecantest/test/tests/test_ws.py
+++ b/tests/pecantest/test/tests/test_ws.py
@@ -59,6 +59,17 @@ class TestWS(FunctionalTest):
assert '1' in body
assert 'aname' in body
+ def test_post_body_parameter_validation(self):
+ res = self.app.post(
+ '/authors', '{"firstname": "Robert"}',
+ headers={"Content-Type": "application/json"},
+ expect_errors=True
+ )
+ self.assertEqual(res.status_int, 400)
+ a = json.loads(res.body.decode('utf-8'))
+ self.assertEqual(a['faultcode'], 'Client')
+ self.assertEqual(a['faultstring'], "I don't like this author!")
+
def test_post_body_parameter(self):
res = self.app.post(
'/authors', '{"firstname": "test"}',
diff --git a/wsme/rest/json.py b/wsme/rest/json.py
index 180ee2c..77277ce 100644
--- a/wsme/rest/json.py
+++ b/wsme/rest/json.py
@@ -140,7 +140,7 @@ def fromjson(datatype, value):
elif attrdef.mandatory:
raise InvalidInput(attrdef.name, None,
"Mandatory field missing.")
- return obj
+ return wsme.types.validate_value(datatype, obj)
elif wsme.types.isusertype(datatype):
value = datatype.frombasetype(
fromjson(datatype.basetype, value))
diff --git a/wsme/rest/xml.py b/wsme/rest/xml.py
index 1ebc3d5..9a836c3 100644
--- a/wsme/rest/xml.py
+++ b/wsme/rest/xml.py
@@ -105,7 +105,7 @@ def fromxml(datatype, element):
elif attrdef.mandatory:
raise InvalidInput(attrdef.name, None,
"Mandatory field missing.")
- return obj
+ return wsme.types.validate_value(datatype, obj)
if datatype is wsme.types.bytes:
return element.text.encode('ascii')
return datatype(element.text)