Skip to content

JsonGenerator writeRaw causes 'IllegalArgumentException: Called operation not supported for TokenBuffer' #2140

@elwaxoro

Description

@elwaxoro

I'm still running into issues with java.lang.IllegalArgumentException: Called operation not supported for TokenBuffer exception using objectMapper.valueToTree<JsonNode>(...) with a serializer that invokes JsonGenerator.writeRaw. Jackson databind version 2.9.6

According to 348 and 743 this should be working?

Exception is as follows:

java.lang.IllegalArgumentException: Called operation not supported for TokenBuffer

	at com.fasterxml.jackson.databind.ObjectMapper.valueToTree(ObjectMapper.java:2802)
	at foo.JacksonSerializerTest.testJsonNode(JacksonSerializerTest.kt:26)
	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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Called operation not supported for TokenBuffer
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._wrapAsIOE(DefaultSerializerProvider.java:509)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:482)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
	at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2655)
	at com.fasterxml.jackson.databind.ObjectMapper.valueToTree(ObjectMapper.java:2797)
	... 23 more
Caused by: java.lang.UnsupportedOperationException: Called operation not supported for TokenBuffer
	at com.fasterxml.jackson.databind.util.TokenBuffer._reportUnsupportedOperation(TokenBuffer.java:1217)
	at com.fasterxml.jackson.databind.util.TokenBuffer.writeRaw(TokenBuffer.java:775)
	at fooTestSerializer.serialize(JacksonSerializerTest.kt:40)
	at foo.TestSerializer.serialize(JacksonSerializerTest.kt:38)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
	... 26 more

Self-contained unit test showing issue (kotlin):

import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializerProvider
import com.fasterxml.jackson.databind.annotation.JsonSerialize
import com.fasterxml.jackson.databind.ser.std.StdSerializer
import org.junit.Test

class JacksonSerializerTest {

    private val objectMapper: ObjectMapper = ObjectMapper()

    @Test
    fun testSerialize() {
        val foo = Foo("JSON!")
        // This works great
        val json: String = objectMapper.writeValueAsString(foo)
    }

    @Test
    fun testJsonNode() {
        val foo = Foo("JSON!")
        // UnsupportedOperationException is thrown here
        val node: JsonNode = objectMapper.valueToTree<JsonNode>(foo)
    }

    @Test
    fun testJsonNode2() {
        val foo = Foo("JSON!")
        val json = objectMapper.writeValueAsString(foo)
        // This works great
        val node: JsonNode = objectMapper.readTree(json)
    }
}

class TestSerializer : StdSerializer<Foo>(Foo::class.java) {
    override fun serialize(value: Foo, gen: JsonGenerator, provider: SerializerProvider) =
            gen.writeRaw("""
                { "Bar" : "${value.Bar}", "Bonus": "Foo" }
            """.trimIndent())
}

@JsonSerialize(using = TestSerializer::class)
data class Foo(val Bar: String)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions