Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JsonbException while marshalling: Invalid count of arguments for setter #82

Closed
minfrin opened this issue Jan 19, 2018 · 5 comments
Closed
Assignees
Labels
bug Something isn't working right
Milestone

Comments

@minfrin
Copy link

minfrin commented Jan 19, 2018

I have a large project that uses cxf-xjc-plugin to autogenerate JAXB bindings for a series of XSDs, and this is able to marshall XML without a problem.

We recently tried to use Jersey's JSON marshalling option, and this has been failing for us with the following exception below.

javax.json.bind.JsonbException: Invalid count of arguments for setter: public void javax.xml.datatype.XMLGregorianCalendar.setTime(int,int,int) org.eclipse.yasson.internal.model.Property.getPropertyType(Property.java:137) org.eclipse.yasson.internal.model.PropertyModel.<init>(PropertyModel.java:85) org.eclipse.yasson.internal.model.customization.ordering.PropertyOrdering.lambda$orderProperties$0(PropertyOrdering.java:79) java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1620) java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) org.eclipse.yasson.internal.model.customization.ordering.PropertyOrdering.orderProperties(PropertyOrdering.java:80) org.eclipse.yasson.internal.ClassParser.parseProperties(ClassParser.java:60) org.eclipse.yasson.internal.MappingContext$ParseClassModelFunction.apply(MappingContext.java:56) org.eclipse.yasson.internal.MappingContext$ParseClassModelFunction.apply(MappingContext.java:37) java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) org.eclipse.yasson.internal.MappingContext.getOrCreateClassModel(MappingContext.java:100) org.eclipse.yasson.internal.serializer.ObjectSerializer.serializeInternal(ObjectSerializer.java:57) org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60) org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:91) org.eclipse.yasson.internal.serializer.ObjectSerializer.marshallProperty(ObjectSerializer.java:92) org.eclipse.yasson.internal.serializer.ObjectSerializer.serializeInternal(ObjectSerializer.java:59) org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60) org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:91) org.eclipse.yasson.internal.serializer.CollectionSerializer.serializeInternal(CollectionSerializer.java:76) org.eclipse.yasson.internal.serializer.CollectionSerializer.serializeInternal(CollectionSerializer.java:35) org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60) org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:91) org.eclipse.yasson.internal.serializer.ObjectSerializer.marshallProperty(ObjectSerializer.java:92) org.eclipse.yasson.internal.serializer.ObjectSerializer.serializeInternal(ObjectSerializer.java:59) org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60) org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:91) org.eclipse.yasson.internal.serializer.ObjectSerializer.marshallProperty(ObjectSerializer.java:92) org.eclipse.yasson.internal.serializer.ObjectSerializer.serializeInternal(ObjectSerializer.java:59) org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60) org.eclipse.yasson.internal.Marshaller.serializeRoot(Marshaller.java:118) org.eclipse.yasson.internal.Marshaller.marshall(Marshaller.java:76) org.eclipse.yasson.internal.JsonBinding.toJson(JsonBinding.java:98) org.glassfish.jersey.jsonb.internal.JsonBindingProvider.writeTo(JsonBindingProvider.java:118) org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:266) org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:251) org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:163) org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:109) org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:163) org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:85) org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:163) org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1135) org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:662) org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:395) org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:385) org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:280) org.glassfish.jersey.internal.Errors$1.call(Errors.java:272) org.glassfish.jersey.internal.Errors$1.call(Errors.java:268) org.glassfish.jersey.internal.Errors.process(Errors.java:316) org.glassfish.jersey.internal.Errors.process(Errors.java:298) org.glassfish.jersey.internal.Errors.process(Errors.java:268) org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289) org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256) org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703) org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416) org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

We are using the following JAXB related jars:

[INFO] javax.activation:activation:jar:1.1:compile [INFO] javax.annotation:javax.annotation-api:jar:1.2:compile [INFO] javax.el:javax.el-api:jar:3.0.0:compile [INFO] javax.enterprise:cdi-api:jar:2.0:compile [INFO] javax.inject:javax.inject:jar:1:compile [INFO] javax.interceptor:javax.interceptor-api:jar:1.2:compile [INFO] javax.json:javax.json-api:jar:1.1:compile [INFO] javax.json.bind:javax.json.bind-api:jar:1.0:compile [INFO] javax.mail:mail:jar:1.4.7:compile [INFO] javax.servlet:javax.servlet-api:jar:4.0.0:provided [INFO] javax.servlet:servlet-api:jar:2.3:compile [INFO] javax.transaction:jta:jar:1.1:compile [INFO] javax.validation:validation-api:jar:1.1.0.Final:compile [INFO] javax.ws.rs:javax.ws.rs-api:jar:2.1:compile [INFO] javax.ws.rs:jsr311-api:jar:1.1.1:compile [INFO] javax.xml.bind:jaxb-api:jar:2.1:compile [INFO] javax.xml.stream:stax-api:jar:1.0-2:compile [INFO] org.eclipse:yasson:jar:1.0:compile [INFO] org.eclipse.persistence:org.eclipse.persistence.asm:jar:2.6.4:compile [INFO] org.eclipse.persistence:org.eclipse.persistence.core:jar:2.6.4:compile [INFO] org.eclipse.persistence:org.eclipse.persistence.moxy:jar:2.6.4:compile [INFO] org.glassfish:javax.json:jar:1.0.4:compile [INFO] org.glassfish.hk2:hk2-api:jar:2.5.0-b42:compile [INFO] org.glassfish.hk2:hk2-locator:jar:2.5.0-b42:compile [INFO] org.glassfish.hk2:hk2-utils:jar:2.5.0-b42:compile [INFO] org.glassfish.hk2:osgi-resource-locator:jar:1.0.1:compile [INFO] org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b42:compile [INFO] org.glassfish.hk2.external:javax.inject:jar:2.5.0-b42:compile [INFO] org.glassfish.jersey.bundles:jaxrs-ri:jar:2.26:compile [INFO] org.glassfish.jersey.containers:jersey-container-servlet:jar:2.26:compile [INFO] org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.26:compile [INFO] org.glassfish.jersey.core:jersey-client:jar:2.26:compile [INFO] org.glassfish.jersey.core:jersey-common:jar:2.26:compile [INFO] org.glassfish.jersey.core:jersey-server:jar:2.26:compile [INFO] org.glassfish.jersey.ext:jersey-entity-filtering:jar:2.26:compile [INFO] org.glassfish.jersey.inject:jersey-hk2:jar:2.26:compile [INFO] org.glassfish.jersey.media:jersey-media-jaxb:jar:2.26:compile [INFO] org.glassfish.jersey.media:jersey-media-json-binding:jar:2.26:compile [INFO] org.glassfish.jersey.media:jersey-media-moxy:jar:2.26:compile [INFO] org.glassfish.jersey.media:jersey-media-sse:jar:2.26:compile [INFO] org.hamcrest:hamcrest-core:jar:1.3:test [INFO] org.javassist:javassist:jar:3.22.0-CR2:compile [INFO] xalan:xalan:jar:2.7.0:compile [INFO] xerces:xercesImpl:jar:2.6.2:compile [INFO] xml-apis:xml-apis:jar:1.0.b2:compile

The setter javax.xml.datatype.XMLGregorianCalendar.setTime(int,int,int) is a valid setter from the perspective of the docs for XMLGregorianCalendar, does this look familiar to anyone?

@m0mus m0mus added the bug Something isn't working right label Jan 22, 2018
@m0mus m0mus added this to the 1.0.2 milestone Apr 27, 2018
@cwhite102
Copy link

I've run into this same problem marshalling some model classes that work fine with Jaxb.
It feels like having any method that starts with 'set' is being interpreted as a property setter. Even when the method (in our case) takes zero arguments and should likely be ignored (ie. not related to a marshallable property).

May 31, 2018 12:35:58 PM org.eclipse.yasson.internal.Marshaller marshall
SEVERE: Invalid count of arguments for setter: protected void xxxx.AbstractModelWithMutability.setImmutable_transition()

Verdent added a commit to Verdent/yasson that referenced this issue Jul 16, 2018
Signed-off-by: David Kral <david.k.kral@oracle.com>
@cristhiank
Copy link

I just ran into this issue with my custom model classes. I have some REST representational classes with utility methods that starts with "setXXXXXXX(parameter1, paramater2, .....).
And I am getting this exact message.
15:26:32,588 SEVERE [org.eclipse.yasson.internal.Marshaller] (default task-2) Generating incomplete JSON 15:26:32,593 SEVERE [SYNEKUS] (default task-2) Unhandled error: RESTEASY008205: JSON Binding serialization error javax.json.bind.JsonbException: Invalid count of arguments for setter:

IMHO I think Yasson should validate that the "set" methods have one and only one parameter before invoking them. It will be a hassle for people coming from Java EE7+Jackson (as I am).

Should I open a new issue for this ?

Regards!
Cristhian.

@cristhiank
Copy link

I found that the number of arguments is being validated in

throw new JsonbException("Invalid count of arguments for setter: " + getSetter());

It wouldn't be better to log a warning maybe ? It is blocking if I have a method starting with "set" and receiving multiple parameters. Another better option would be exclude this properties from being parsed at all maybe in

public void parseProperties(ClassModel classModel, JsonbAnnotatedElement<Class<?>> classElement) {

@cristhiank
Copy link

Sorry, please omit the previous comments, I just found out that it is fixed in master eaebfcb#diff-0b679cdd432a9709d06c281d3ac6656b

@Verdent
Copy link
Member

Verdent commented Jul 25, 2018

Hi @cristhiank ,
I have created new issue which is mainly focused on problem with "set" methods and multiple parameters.
This issue can be found here #152

@bravehorsie bravehorsie modified the milestone: 1.0.2 Jan 29, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working right
Projects
None yet
Development

No branches or pull requests

6 participants