{"record":{"id":"4e206e7d65f023ba","repo":"quarkusio/quarkus","slug":"variant-list-must-not-be-empty","errorCode":null,"errorMessage":"Variant list must not be empty","messagePattern":"Variant list must not be empty","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/jaxrs/RequestImpl.java","lineNumber":42,"sourceCode":"\n    public RequestImpl(ResteasyReactiveRequestContext requestContext) {\n        this.requestContext = requestContext;\n        this.httpMethod = requestContext.serverRequest().getRequestMethod();\n    }\n\n    @Override\n    public String getMethod() {\n        return requestContext.serverRequest().getRequestMethod();\n    }\n\n    private boolean isRfc7232preconditions() {\n        return true;//todo: do we need config for this?\n    }\n\n    @Override\n    public Variant selectVariant(List<Variant> variants) throws IllegalArgumentException {\n        if (variants == null || variants.size() == 0)\n            throw new IllegalArgumentException(\"Variant list must not be empty\");\n\n        ServerDrivenNegotiation negotiation = new ServerDrivenNegotiation();\n        MultivaluedMap<String, String> requestHeaders = requestContext.getHttpHeaders().getRequestHeaders();\n        negotiation.setAcceptHeaders(requestHeaders.get(HttpHeaders.ACCEPT));\n        negotiation.setAcceptCharsetHeaders(requestHeaders.get(HttpHeaders.ACCEPT_CHARSET));\n        negotiation.setAcceptEncodingHeaders(requestHeaders.get(HttpHeaders.ACCEPT_ENCODING));\n        negotiation.setAcceptLanguageHeaders(requestHeaders.get(HttpHeaders.ACCEPT_LANGUAGE));\n\n        varyHeader = AbstractResponseBuilder.createVaryHeader(variants);\n        requestContext.serverResponse().setResponseHeader(HttpHeaders.VARY, varyHeader);\n        //response.getOutputHeaders().add(VARY, varyHeader);\n        return negotiation.getBestMatch(variants);\n    }\n\n    private List<EntityTag> convertEtag(List<String> tags) {\n        ArrayList<EntityTag> result = new ArrayList<EntityTag>();\n        for (String tag : tags) {\n            String[] split = tag.split(\",\");","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/jaxrs/RequestImpl.java#L24-L60","documentation":"RequestImpl.selectVariant() throws IllegalArgumentException because the JAX-RS contract requires a non-null, non-empty variant list when performing server-driven content negotiation. The library cannot negotiate against zero candidates.","triggerScenarios":"Calling request.selectVariant(List<Variant>) with null or an empty list (e.g. Variant.encodings(...).build() produced no variants or a filter removed them all).","commonSituations":"Building variants from configuration or a database that returned no rows; passing a list built conditionally where every branch was skipped; API misuse where variants were intended to be added after the call.","solutions":["Populate the Variant list with at least one Variant before calling selectVariant().","Guard the call: only invoke selectVariant when the list is non-empty, otherwise return a default representation or 406.","Verify VariantListBuilder usage: addXXX(...) followed by add() actually appended the variants."],"exampleFix":"// before\nVariant v = request.selectVariant(variants);\n// after\nif (variants == null || variants.isEmpty()) {\n    throw new NotAcceptableException();\n}\nVariant v = request.selectVariant(variants);","handlingStrategy":"validation","validationCode":"if (variants == null || variants.isEmpty()) {\n    throw new NotAcceptableException(\"No producible variants\");\n}","typeGuard":"boolean negotiable(List<Variant> v) {\n    return v != null && !v.isEmpty();\n}","tryCatchPattern":"try {\n    return request.selectVariant(variants);\n} catch (IllegalArgumentException e) {\n    throw new NotAcceptableException(e.getMessage());\n}","preventionTips":["Never call selectVariant with an empty list","Build variants with VariantListBuilder and call add() per variant","Default to a fallback representation when variants are absent"],"tags":["jaxrs","resteasy-reactive","content-negotiation","illegal-argument"],"backgroundTag":"empty-variant-list","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"}