Skip to content

Possible ByteArrayModule issue #3793

@lipisak

Description

@lipisak

Describe the bug

Hi falks,
after upgrade to Vaadin 24.8 I noticed that communication via RestTemplate doesn't work in some cases.

If I call endpoint, which returns DTO with byte[] field containing file data, the deserialization fails when there are more then 20000000 bytes.

The stacktrace:

com.fasterxml.jackson.core.exc.StreamConstraintsException: String value length (20054016) exceeds the maximum allowed (20000000, from StreamReadConstraints.getMaxStringLength()) at com.fasterxml.jackson.core.StreamReadConstraints._constructException(StreamReadConstraints.java:658) at com.fasterxml.jackson.core.StreamReadConstraints.validateStringLength(StreamReadConstraints.java:593) at com.fasterxml.jackson.core.util.ReadConstrainedTextBuffer.validateStringLength(ReadConstrainedTextBuffer.java:27) at com.fasterxml.jackson.core.util.TextBuffer.finishCurrentSegment(TextBuffer.java:1017) at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:2544) at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishAndReturnString(UTF8StreamJsonParser.java:2520) at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:294) at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer._deserializeAnyScalar(JsonNodeDeserializer.java:666) at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:108) at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:24) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342) at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4944) at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:3165) at com.vaadin.hilla.parser.jackson.ByteArrayModule$ByteArrayDeSerializer.deserialize(ByteArrayModule.java:36) at com.vaadin.hilla.parser.jackson.ByteArrayModule$ByteArrayDeSerializer.deserialize(ByteArrayModule.java:29) at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:137) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:392) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342) at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2130) at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1500) at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:397) at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:356) at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:105) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:903) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:801) at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:518) at com.mediasol.dp.ui_v2.reporting.impl.ReportingServiceImpl.runPipelineWithFileResult(ReportingServiceImpl.java:107) at com.mediasol.dp.ui_v2.reporting.impl.RunReportDialogPresenterImpl.lambda$runPipeline$5(RunReportDialogPresenterImpl.java:163) at com.mediasol.solar.vaadin.views.async.UIAsyncRunnerImpl.lambda$runAsync$3(UIAsyncRunnerImpl.java:65) at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) at org.springframework.security.concurrent.DelegatingSecurityContextRunnable.run(DelegatingSecurityContextRunnable.java:94) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583)

From what I can see the problem is within ByteArrayModule for jackson, which uses plain ObjectMapper (String length constraint set to 20M).

I guess hilla module for jackson was added because of the new way of server-client communication (serialization/deserialization), but it also affects my spring backend rest communication, which is not good at all. Any suggestions for this?

Thank you for quick reply

JS

Expected-behavior

No response

Reproduction

Easiest way is to create rest template from spring and call for DTO, with byte[] field where the length of bytes is over 20_000_000 (over 20M)

System Info

Vaadin 24.8.3, Spring Boot 3.5.3.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinghillaIssues related to Hillainvestigation

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions