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

NullPointerException when @JsonbTransient is applied on property without setter #34

Closed
ggam opened this issue Aug 9, 2017 · 8 comments
Assignees
Labels
bug Something isn't working right
Milestone

Comments

@ggam
Copy link
Member

ggam commented Aug 9, 2017

I'm using Yasson 1.0.

Having the following mapping:

public class Foo implements Serializable {

    @JsonbTransient
    private String bar;

    public String getBar() {
        return bar;
    }
}

AnnotationIntrospector searches for a @JsonbTransient on a setBar(String) method and since it can't find it, it marks the property as "writeable":

if (transientInfo.contains(AnnotationTarget.PROPERTY)) {
    // ...

    if(!transientInfo.contains(AnnotationTarget.SETTER)){
        builder.setWriteTransient(true);
    }
}

But later on introspectCustomization it tries to do some checks on that setter method that does not exist:

if (builder.isWriteTransient()) {
    // ...
    introspector.checkTransientIncompatible(property.getSetterElement());
}

Resulting in the following stacktrace:

Caused by: java.lang.NullPointerException
	at org.eclipse.yasson.internal.AnnotationIntrospector.checkTransientIncompatible(AnnotationIntrospector.java:534)
	at org.eclipse.yasson.internal.model.PropertyModel.introspectCustomization(PropertyModel.java:159)
	at org.eclipse.yasson.internal.model.PropertyModel.<init>(PropertyModel.java:87)
	at org.eclipse.yasson.internal.model.customization.ordering.PropertyOrdering.lambda$orderProperties$0(PropertyOrdering.java:79)
	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
	at java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1620)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at org.eclipse.yasson.internal.model.customization.ordering.PropertyOrdering.orderProperties(PropertyOrdering.java:80)
	at org.eclipse.yasson.internal.ClassParser.parseProperties(ClassParser.java:60)
	at org.eclipse.yasson.internal.MappingContext$ParseClassModelFunction.apply(MappingContext.java:56)
	at org.eclipse.yasson.internal.MappingContext$ParseClassModelFunction.apply(MappingContext.java:37)
	at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
	at org.eclipse.yasson.internal.MappingContext.getOrCreateClassModel(MappingContext.java:100)
	at org.eclipse.yasson.internal.serializer.ObjectSerializer.serializeInternal(ObjectSerializer.java:57)
	at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60)
	at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:91)
	at org.eclipse.yasson.internal.serializer.CollectionSerializer.serializeInternal(CollectionSerializer.java:79)
	at org.eclipse.yasson.internal.serializer.CollectionSerializer.serializeInternal(CollectionSerializer.java:35)
	at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60)
	at org.eclipse.yasson.internal.Marshaller.serializeRoot(Marshaller.java:118)
	at org.eclipse.yasson.internal.Marshaller.marshall(Marshaller.java:76)
	at org.eclipse.yasson.internal.JsonBinding.toJson(JsonBinding.java:98)
	at xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.writeTo(BaseJsonbJaxrsProvider.java:57)
	at xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.writeTo$$super(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:49)
	at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:77)
	at org.jboss.weld.probe.InvocationMonitor$InterceptorAction.proceed(InvocationMonitor.java:198)
	at org.jboss.weld.probe.InvocationMonitor$InterceptorAction.proceed(InvocationMonitor.java:194)
	at org.jboss.weld.probe.InvocationMonitor$Action.perform(InvocationMonitor.java:173)
	at org.jboss.weld.probe.InvocationMonitor.monitor(InvocationMonitor.java:139)
	at sun.reflect.GeneratedMethodAccessor23.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:73)
	at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
	at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
	at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
	at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
	at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
	at xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.writeTo(Unknown Source)
	at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.writeTo(AbstractWriterInterceptorContext.java:131)
	at org.jboss.resteasy.core.interception.ServerWriterInterceptorContext.writeTo(ServerWriterInterceptorContext.java:60)
	at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:120)
	at org.jboss.resteasy.security.doseta.DigitalSigningInterceptor.aroundWriteTo(DigitalSigningInterceptor.java:145)
	at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:124)
	at org.jboss.resteasy.plugins.interceptors.encoding.GZIPEncodingInterceptor.aroundWriteTo(GZIPEncodingInterceptor.java:100)
	at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:124)
	at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:98)
	at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:473)
	... 62 more

Workaround for now is just annotate the getter.

@m0mus
Copy link
Member

m0mus commented Aug 30, 2017

I confirm that this issue exists. Roman, please take a look.

@m0mus m0mus added the bug Something isn't working right label Aug 30, 2017
@m0mus m0mus added this to the 1.0.1 milestone Aug 30, 2017
m0mus added a commit that referenced this issue Aug 30, 2017
@m0mus m0mus assigned m0mus and unassigned bravehorsie Aug 30, 2017
@m0mus
Copy link
Member

m0mus commented Aug 30, 2017

Fixed.

@m0mus m0mus closed this as completed Aug 30, 2017
@ggam
Copy link
Member Author

ggam commented Aug 30, 2017 via email

@priyal85
Copy link

priyal85 commented Oct 5, 2017

Hi Dmitry,
I'm too facing the same issue when using Jersey which internally uses yasson for JSON bindings. In which version the fix is available. I'm still getting the issue in 1.0 which is released on June 2017.

@m0mus
Copy link
Member

m0mus commented Oct 6, 2017 via email

@bshannon
Copy link

This bug was not completely fixed. Here's a simple test case that still fails:

import javax.json.bind.annotation.JsonbTransient;
import javax.json.bind.*;

public class Test {

    //@JsonbTransient
    //private String    binString;

    @JsonbTransient
    public String getBinString() {
        return "";
    }

    public static void main(String argv[]) throws Exception {
        Jsonb jsonb = JsonbBuilder.create();
        Test t = new Test();
        String result = jsonb.toJson(t);
        System.out.println(result);
    }
}

If you uncomment the field declaration, it works.

@bshannon bshannon reopened this Jun 14, 2018
@aguibert
Copy link
Member

aguibert commented Nov 8, 2018

hi @bshannon, I tested your code example on 1.0.2 and the the latest code level and it works as expected (empty result).

@bshannon
Copy link

bshannon commented Nov 9, 2018

Ok, good. Maybe someone should create a unit test and then close this bug?

aguibert added a commit to aguibert/yasson that referenced this issue Nov 17, 2018
aguibert added a commit that referenced this issue Dec 14, 2018
@aguibert aguibert self-assigned this Dec 14, 2018
@bravehorsie bravehorsie modified the milestones: 1.0.1, 1.0.3 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