[
https://issues.apache.org/jira/browse/OLINGO-615?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Frederic Souchu updated OLINGO-615:
-----------------------------------
Description:
The serializer code path is missing a fallback for enumerated values, similar
to collection or complex types.
(exception trace below)
How to reproduce:
- declare an enumerated field in EDM
- add enum value in entity set:
{code:java}
EntitySet entitySet = new EntitySetImpl();
entitySet.getEntities().add(new EntityImpl()
.addProperty(new PropertyImpl(null, "ID", ValueType.PRIMITIVE,
4864))
.addProperty(new PropertyImpl("company.com.MyEnum",
"EnumField", ValueType.ENUM, 2)));
{code}
- call serializer from servlet, an exception is raised: Property type not yet
supported!
What is happening (as far as I can tell):
- EdmTypeInfo.java primitiveType member is null (as expected)
- enumType is correctly set to my custom enum type
- ODataJsonSerializer.java correctly evaluates the type as 'not primitive',
tries various fallback scenario to throw an exception.
>> The appriopriate writePropertyValue method (where enum serialization code
>> is) is never called!!
{code:java}
private void writePropertyValue(final EdmProperty edmProperty,
final Property property, final Set<List<String>> selectedPaths,
final JsonGenerator json) throws IOException, SerializerException {
try {
if (edmProperty.isPrimitive()) {
/* primitive handling code not executed for an enum !! */
} else if (edmProperty.isCollection()) {
writeComplexCollection((EdmComplexType) edmProperty.getType(),
property, selectedPaths, json);
} else if (property.isLinkedComplex()) {
writeComplexValue((EdmComplexType) edmProperty.getType(),
property.asLinkedComplex().getValue(),
selectedPaths, json);
} else if (property.isComplex()) {
writeComplexValue((EdmComplexType) edmProperty.getType(),
property.asComplex(), selectedPaths, json);
} else {
throw new SerializerException("Property type not yet supported!",
SerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE,
edmProperty.getName());
}
} catch (final EdmPrimitiveTypeException e) {
/* error msg mgt */
}
}
{code}
Note: setting the value using:
{code:java}
.addProperty(new PropertyImpl("company.com.MyEnum", "EnumField",
ValueType.PRIMITIVE, 2))
{code}
or
{code:java}
.addProperty(new PropertyImpl(null, "EnumField", ValueType.PRIMITIVE, 2))
{code}
yields the same exception:
{code:text}
ODataJsonSerializer.writePropertyValue(EdmProperty, Property,
Set<List<String>>, JsonGenerator) line: 327
ODataJsonSerializer.writeProperty(EdmProperty, Property, Set<List<String>>,
JsonGenerator) line: 299
ODataJsonSerializer.writeProperties(EdmStructuredType, List<Property>,
SelectOption, JsonGenerator) line: 238
ODataJsonSerializer.writeEntity(EdmEntityType, Entity, ContextURL,
ExpandOption, SelectOption, JsonGenerator) line: 222
ODataJsonSerializer.writeEntitySet(EdmEntityType, EntitySet, ExpandOption,
SelectOption, JsonGenerator) line: 197
ODataJsonSerializer.entityCollection(EdmEntityType, EntitySet,
EntityCollectionSerializerOptions) line: 153
TransactionProcessor.readEntityCollection(ODataRequest, ODataResponse, UriInfo,
ContentType) line: 132
ODataHandler.handleEntityDispatching(ODataRequest, ODataResponse, boolean,
boolean, boolean) line: 597
ODataHandler.handleEntityDispatching(ODataRequest, ODataResponse,
UriResourcePartTyped) line: 583
ODataHandler.handleResourceDispatching(ODataRequest, ODataResponse) line: 251
ODataHandler.processInternal(ODataRequest, ODataResponse) line: 192
ODataHandler.process(ODataRequest) line: 111
ODataHttpHandlerImpl.process(HttpServletRequest, HttpServletResponse) line: 66
TransactionJournalRestService.customerJournal() line: 95 (out of synch)
TransactionJournalRestService$Proxy$_$$_WeldClientProxy.customerJournal() line:
not available
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available
[native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
MethodInjectorImpl.invoke(HttpRequest, HttpResponse, Object) line: 167
ResourceMethod.invokeOnTarget(HttpRequest, HttpResponse, Object) line: 269
ResourceMethod.invoke(HttpRequest, HttpResponse, Object) line: 227
ResourceMethod.invoke(HttpRequest, HttpResponse) line: 216
SynchronousDispatcher.getResponse(HttpRequest, HttpResponse, ResourceInvoker)
line: 542
SynchronousDispatcher.invoke(HttpRequest, HttpResponse, ResourceInvoker) line:
524
SynchronousDispatcher.invoke(HttpRequest, HttpResponse) line: 126
ServletContainerDispatcher.service(String, HttpServletRequest,
HttpServletResponse, boolean) line: 208
HttpServlet30Dispatcher(HttpServletDispatcher).service(String,
HttpServletRequest, HttpServletResponse) line: 55
HttpServlet30Dispatcher(HttpServletDispatcher).service(HttpServletRequest,
HttpServletResponse) line: 50
HttpServlet30Dispatcher(HttpServlet).service(ServletRequest, ServletResponse)
line: 847
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line:
295
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 214
StandardWrapperValve.invoke(Request, Response) line: 231
StandardContextValve.invoke(Request, Response) line: 149
WebNonTxEmCloserValve.invoke(Request, Response) line: 50
WebNonTxEmCloserValve.invoke(Request, Response) line: 50
SecurityContextAssociationValve.invoke(Request, Response) line: 169
StandardHostValve.invoke(Request, Response) line: 145
ErrorReportValve.invoke(Request, Response) line: 97
StandardEngineValve.invoke(Request, Response) line: 102
CoyoteAdapter.service(Request, Response) line: 344
Http11Processor.process(Socket) line: 856
Http11Protocol$Http11ConnectionHandler.process(Socket) line: 653
JIoEndpoint$Worker.run() line: 926
Thread.run() line: 662
{code}
was:
The serializer code path is missing a fallback for enumerated values, similar
to collection or complex types.
How to reproduce:
- declare an enumerated field in EDM
- add enum value in entity set:
{code:java}
EntitySet entitySet = new EntitySetImpl();
entitySet.getEntities().add(new EntityImpl()
.addProperty(new PropertyImpl(null, "ID", ValueType.PRIMITIVE,
4864))
.addProperty(new PropertyImpl(null, "company.com.MyEnum",
ValueType.ENUM, 2)));
{code}
- call serializer from servlet, an exception is raised: Property type not yet
supported!
What is happening:
- EdmTypeInfo.java primitiveType member is null (as expected)
- enumType is correctly set to my custom enum type
- ODataJsonSerializer.java correctly evaluates the type as 'not primitive' and
does not call the appriopriate writePropertyValue method (where enum
serialization code is!!)
{code:java}
private void writePropertyValue(final EdmProperty edmProperty,
final Property property, final Set<List<String>> selectedPaths,
final JsonGenerator json) throws IOException, SerializerException {
try {
if (edmProperty.isPrimitive()) {
/* primitive handling code not executed for an enum !! */
} else if (edmProperty.isCollection()) {
writeComplexCollection((EdmComplexType) edmProperty.getType(),
property, selectedPaths, json);
} else if (property.isLinkedComplex()) {
writeComplexValue((EdmComplexType) edmProperty.getType(),
property.asLinkedComplex().getValue(),
selectedPaths, json);
} else if (property.isComplex()) {
writeComplexValue((EdmComplexType) edmProperty.getType(),
property.asComplex(), selectedPaths, json);
} else {
throw new SerializerException("Property type not yet supported!",
SerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE,
edmProperty.getName());
}
} catch (final EdmPrimitiveTypeException e) {
/* error msg mgt */
}
}
{code}
> Unable to serialize custom enum type
> ------------------------------------
>
> Key: OLINGO-615
> URL: https://issues.apache.org/jira/browse/OLINGO-615
> Project: Olingo
> Issue Type: Bug
> Components: odata4-server
> Affects Versions: (Java) V4 4.0.0-beta-02
> Reporter: Frederic Souchu
>
> The serializer code path is missing a fallback for enumerated values, similar
> to collection or complex types.
> (exception trace below)
> How to reproduce:
> - declare an enumerated field in EDM
> - add enum value in entity set:
> {code:java}
> EntitySet entitySet = new EntitySetImpl();
> entitySet.getEntities().add(new EntityImpl()
> .addProperty(new PropertyImpl(null, "ID", ValueType.PRIMITIVE,
> 4864))
> .addProperty(new PropertyImpl("company.com.MyEnum",
> "EnumField", ValueType.ENUM, 2)));
> {code}
> - call serializer from servlet, an exception is raised: Property type not yet
> supported!
> What is happening (as far as I can tell):
> - EdmTypeInfo.java primitiveType member is null (as expected)
> - enumType is correctly set to my custom enum type
> - ODataJsonSerializer.java correctly evaluates the type as 'not primitive',
> tries various fallback scenario to throw an exception.
> >> The appriopriate writePropertyValue method (where enum serialization code
> >> is) is never called!!
> {code:java}
> private void writePropertyValue(final EdmProperty edmProperty,
> final Property property, final Set<List<String>> selectedPaths,
> final JsonGenerator json) throws IOException, SerializerException {
> try {
> if (edmProperty.isPrimitive()) {
> /* primitive handling code not executed for an enum !! */
> } else if (edmProperty.isCollection()) {
> writeComplexCollection((EdmComplexType) edmProperty.getType(),
> property, selectedPaths, json);
> } else if (property.isLinkedComplex()) {
> writeComplexValue((EdmComplexType) edmProperty.getType(),
> property.asLinkedComplex().getValue(),
> selectedPaths, json);
> } else if (property.isComplex()) {
> writeComplexValue((EdmComplexType) edmProperty.getType(),
> property.asComplex(), selectedPaths, json);
> } else {
> throw new SerializerException("Property type not yet supported!",
> SerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE,
> edmProperty.getName());
> }
> } catch (final EdmPrimitiveTypeException e) {
> /* error msg mgt */
> }
> }
> {code}
> Note: setting the value using:
> {code:java}
> .addProperty(new PropertyImpl("company.com.MyEnum", "EnumField",
> ValueType.PRIMITIVE, 2))
> {code}
> or
> {code:java}
> .addProperty(new PropertyImpl(null, "EnumField", ValueType.PRIMITIVE, 2))
> {code}
> yields the same exception:
> {code:text}
> ODataJsonSerializer.writePropertyValue(EdmProperty, Property,
> Set<List<String>>, JsonGenerator) line: 327
> ODataJsonSerializer.writeProperty(EdmProperty, Property, Set<List<String>>,
> JsonGenerator) line: 299
> ODataJsonSerializer.writeProperties(EdmStructuredType, List<Property>,
> SelectOption, JsonGenerator) line: 238
> ODataJsonSerializer.writeEntity(EdmEntityType, Entity, ContextURL,
> ExpandOption, SelectOption, JsonGenerator) line: 222
> ODataJsonSerializer.writeEntitySet(EdmEntityType, EntitySet, ExpandOption,
> SelectOption, JsonGenerator) line: 197
> ODataJsonSerializer.entityCollection(EdmEntityType, EntitySet,
> EntityCollectionSerializerOptions) line: 153
> TransactionProcessor.readEntityCollection(ODataRequest, ODataResponse,
> UriInfo, ContentType) line: 132
> ODataHandler.handleEntityDispatching(ODataRequest, ODataResponse, boolean,
> boolean, boolean) line: 597
> ODataHandler.handleEntityDispatching(ODataRequest, ODataResponse,
> UriResourcePartTyped) line: 583
> ODataHandler.handleResourceDispatching(ODataRequest, ODataResponse) line: 251
> ODataHandler.processInternal(ODataRequest, ODataResponse) line: 192
> ODataHandler.process(ODataRequest) line: 111
> ODataHttpHandlerImpl.process(HttpServletRequest, HttpServletResponse) line:
> 66
> TransactionJournalRestService.customerJournal() line: 95 (out of synch)
> TransactionJournalRestService$Proxy$_$$_WeldClientProxy.customerJournal()
> line: not available
> NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not
> available [native method]
> NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
> DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
> Method.invoke(Object, Object...) line: 597
> MethodInjectorImpl.invoke(HttpRequest, HttpResponse, Object) line: 167
> ResourceMethod.invokeOnTarget(HttpRequest, HttpResponse, Object) line: 269
> ResourceMethod.invoke(HttpRequest, HttpResponse, Object) line: 227
> ResourceMethod.invoke(HttpRequest, HttpResponse) line: 216
> SynchronousDispatcher.getResponse(HttpRequest, HttpResponse, ResourceInvoker)
> line: 542
> SynchronousDispatcher.invoke(HttpRequest, HttpResponse, ResourceInvoker)
> line: 524
> SynchronousDispatcher.invoke(HttpRequest, HttpResponse) line: 126
> ServletContainerDispatcher.service(String, HttpServletRequest,
> HttpServletResponse, boolean) line: 208
> HttpServlet30Dispatcher(HttpServletDispatcher).service(String,
> HttpServletRequest, HttpServletResponse) line: 55
> HttpServlet30Dispatcher(HttpServletDispatcher).service(HttpServletRequest,
> HttpServletResponse) line: 50
> HttpServlet30Dispatcher(HttpServlet).service(ServletRequest, ServletResponse)
> line: 847
> ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse)
> line: 295
> ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 214
> StandardWrapperValve.invoke(Request, Response) line: 231
> StandardContextValve.invoke(Request, Response) line: 149
> WebNonTxEmCloserValve.invoke(Request, Response) line: 50
> WebNonTxEmCloserValve.invoke(Request, Response) line: 50
> SecurityContextAssociationValve.invoke(Request, Response) line: 169
> StandardHostValve.invoke(Request, Response) line: 145
> ErrorReportValve.invoke(Request, Response) line: 97
> StandardEngineValve.invoke(Request, Response) line: 102
> CoyoteAdapter.service(Request, Response) line: 344
> Http11Processor.process(Socket) line: 856
> Http11Protocol$Http11ConnectionHandler.process(Socket) line: 653
> JIoEndpoint$Worker.run() line: 926
> Thread.run() line: 662
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)