Hi devs, Now the API spits error messages irrespective of the backend exception. It sends the JSON error message even if there is an Nullpointer in our backend. Writing a exception mapper for throwable did the trick.
Here is the schema I came up with for validating input. I derived it from the sample inputs i have. Please review it. Pretty sure there is space for improvements particularly min occurs. <?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="partition"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="provider" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="property" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:all> <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> </xs:all> </xs:complexType> </xs:element> <xs:element name="partitionMin" type="xs:int" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="partitionMax" type="xs:int" minOccurs="1" maxOccurs="1" nillable="false"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="autoscalePolicy"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="loadThresholds" minOccurs="1" maxOccurs="1" nillable="false"> <xs:complexType> <xs:all> <xs:element name="requestsInFlight" type="thresholdValues" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="memoryConsumption" type="thresholdValues" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="loadAverage" type="thresholdValues" minOccurs="1" maxOccurs="1" nillable="false"/> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="deploymentPolicy"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:string" maxOccurs="1" minOccurs="1" nillable="false"/> <xs:element name="partitionGroup"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:string" maxOccurs="1" minOccurs="1" nillable="false"/> <xs:element name="partitionAlgo" minOccurs="1" maxOccurs="1" nillable="false"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="round-robin"/> <xs:enumeration value="one-after-another"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="partition" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:all> <xs:element name="id" type="xs:string" maxOccurs="1" minOccurs="1" nillable="false"/> <xs:element name="partitionMax" type="xs:int" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="partitionMin" type="xs:int" minOccurs="1" maxOccurs="1" nillable="false"/> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="cartridgeDefinitionBean"> <xs:complexType> <xs:sequence> <xs:element name="type" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="provider" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="host" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="displayName" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="description" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="version" type="xs:float" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="defaultAutoscalingPolicy" type="xs:string" minOccurs="0" maxOccurs="1" nillable="false"/> <xs:element name="multiTenant" type="xs:boolean" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="portMapping" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:all> <xs:element name="protocol" type="xs:string" maxOccurs="1" minOccurs="1" nillable="false"/> <xs:element name="port" type="xs:int" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="proxyPort" type="xs:int" minOccurs="1" maxOccurs="1" nillable="false"/> </xs:all> </xs:complexType> </xs:element> <xs:element name="iaasProvider" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="type" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="imageId" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="maxInstanceLimit" type="xs:int" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="property" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:all> <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="loadBalancer" minOccurs="0" maxOccurs="1" nillable="true"> <xs:complexType> <xs:sequence> <xs:element name="type" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="property" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:all> <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="property" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:all> <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="thresholdValues"> <xs:all> <xs:element name="average" type="xs:int" minOccurs="1" maxOccurs="1"/> <xs:element name="gradient" type="xs:float" minOccurs="1" maxOccurs="1"/> <xs:element name="secondDerivative" type="xs:float" minOccurs="1" maxOccurs="1"/> <xs:element name="scaleDownMarginOfGradient" type="xs:float" minOccurs="1" maxOccurs="1"/> <xs:element name="scaleDownMarginOfSecondDerivative" type="xs:float" minOccurs="1" maxOccurs="1"/> </xs:all> </xs:complexType> </xs:schema>
