{"record":{"id":"6e2b75111b2df81e","repo":"quarkusio/quarkus","slug":"invalid-character","errorCode":null,"errorMessage":"Invalid character: ","messagePattern":"Invalid character: ","errorType":"exception","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"independent-projects/resteasy-reactive/common/runtime/src/main/java/org/jboss/resteasy/reactive/common/providers/serialisers/CharacterMessageBodyHandler.java","lineNumber":29,"sourceCode":"import jakarta.ws.rs.core.MultivaluedMap;\nimport jakarta.ws.rs.ext.MessageBodyReader;\n\npublic class CharacterMessageBodyHandler extends PrimitiveBodyHandler implements MessageBodyReader<Character> {\n    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {\n        return type == Character.class;\n    }\n\n    public Character readFrom(Class<Character> type, Type genericType, Annotation[] annotations, MediaType mediaType,\n            MultivaluedMap<String, String> httpHeaders, InputStream entityStream)\n            throws IOException, WebApplicationException {\n        return doReadFrom(entityStream);\n    }\n\n    protected char doReadFrom(InputStream entityStream) throws IOException {\n        String string = readFrom(entityStream, false);\n        if (string.length() == 1)\n            return string.charAt(0);\n        throw new BadRequestException(\"Invalid character: \" + string);\n    }\n}\n","sourceCodeStart":11,"sourceCodeEnd":32,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/common/runtime/src/main/java/org/jboss/resteasy/reactive/common/providers/serialisers/CharacterMessageBodyHandler.java#L11-L32","documentation":"CharacterMessageBodyHandler.doReadFrom throws a jakarta.ws.rs.BadRequestException when the response/entity body is not exactly one character long. A Java char can only hold a single character, so any entity stream that decodes to a string of length != 1 cannot be converted to a Character.","triggerScenarios":"Reading an HTTP entity as Character/char when the server returns an empty body, multi-character text (e.g. \"ab\", a word), or whitespace-padded content.","commonSituations":"REST clients declaring Character as the response type against endpoints that return JSON strings or longer text; endpoints that changed their payload shape; empty 200 responses.","solutions":["Change the expected entity type to String and validate/extract the single character yourself","Fix the server endpoint to return exactly one character for Character consumers","Check for empty/oversized bodies before requesting a Character entity"],"exampleFix":"// before\nchar c = client.target(url).request().get(char.class);\n// after\nString s = client.target(url).request().get(String.class);\nif (s == null || s.length() != 1) throw new IllegalStateException(\"Expected single char, got: \" + s);\nchar c = s.charAt(0);","handlingStrategy":"try-catch","validationCode":"String body = response.readEntity(String.class);\nif (body == null || body.length() != 1) { throw new IllegalStateException(\"Expected single-character entity\"); }","typeGuard":"boolean isSingleChar(String s) { return s != null && s.length() == 1; }","tryCatchPattern":"try {\n    char c = response.readEntity(char.class);\n} catch (BadRequestException e) {\n    // body not exactly one character; fall back to String\n    String s = response.readEntity(String.class);\n}","preventionTips":["Avoid Character/char entity types for HTTP responses; use String and validate","Check Content-Length or read as String before mapping to char","Keep server/client payload contracts aligned"],"tags":["resteasy-reactive","message-body-reader","bad-request","character-entity"],"backgroundTag":"entity-body-conversion-failed","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}