{"record":{"id":"c2642747d5ba266c","repo":"OpenFeign/feign","slug":"jaxb-only-supports-encoding-raw-types-found-bod-c26427","errorCode":null,"errorMessage":"JAXB only supports encoding raw types. Found ${bodyType}","messagePattern":"JAXB only supports encoding raw types\\. Found (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"jaxb/src/main/java/feign/jaxb/JAXBEncoder.java","lineNumber":58,"sourceCode":" *     .encoder(new JAXBEncoder(jaxbFactory))\n *     .target(MyApi.class, \"http://api\");\n * </pre>\n *\n * <p>The JAXBContextFactory should be reused across requests as it caches the created JAXB\n * contexts.\n */\npublic class JAXBEncoder implements Encoder, PredicatedEncoder {\n\n  private final JAXBContextFactory jaxbContextFactory;\n\n  public JAXBEncoder(JAXBContextFactory jaxbContextFactory) {\n    this.jaxbContextFactory = jaxbContextFactory;\n  }\n\n  @Override\n  public void encode(Object object, Type bodyType, RequestTemplate template) {\n    if (!(bodyType instanceof Class)) {\n      throw new UnsupportedOperationException(\n          \"JAXB only supports encoding raw types. Found \" + bodyType);\n    }\n    try {\n      Marshaller marshaller = jaxbContextFactory.createMarshaller((Class<?>) bodyType);\n      StringWriter stringWriter = new StringWriter();\n      marshaller.marshal(object, stringWriter);\n      template.body(stringWriter.toString());\n    } catch (JAXBException e) {\n      throw new EncodeException(e.toString(), e);\n    }\n  }\n\n  @Override\n  public boolean canEncode(Object object, Type bodyType, RequestTemplate template) {\n    return Util.isXmlContentType(template);\n  }\n}\n","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/OpenFeign/feign/blob/e2a1e27560a1e68840c34f031afca88b36096e30/jaxb/src/main/java/feign/jaxb/JAXBEncoder.java#L40-L76","documentation":"Same as error 102 in the javax jaxb module: JAXBEncoder rejects non-Class (generic/ParameterizedType) body types with UnsupportedOperationException because JAXB marshalling requires a raw annotated root class.","triggerScenarios":"encode() called with bodyType such as List<Foo> or Map<String,Foo> when using JAXBEncoder.","commonSituations":"POSTing collections or generic wrappers with JAXB; expecting collection marshalling analogous to JSON encoders.","solutions":["Change the request body type to a single @XmlRootElement-annotated class.","Introduce a wrapper DTO holding the collection.","Use a JSON encoder for generic body types."],"exampleFix":"// before\nvoid post(List<Order> orders);\n// after\n@XmlRootElement class Orders { @XmlElement(name=\"order\") List<Order> list; }\nvoid post(Orders orders);","handlingStrategy":"type-guard","validationCode":"// before calling the endpoint\nif (!(bodyType instanceof Class)) {\n  throw new IllegalArgumentException(\"use a raw @XmlRootElement class for JAXB request bodies\");\n}","typeGuard":"boolean rawClass(java.lang.reflect.Type t) {\n  return t instanceof Class;\n}","tryCatchPattern":"try {\n  api.post(obj);\n} catch (UnsupportedOperationException e) {\n  // restructure the body type into an @XmlRootElement wrapper\n}","preventionTips":["Avoid generic bodies (List/Map) with JAXB encoding.","Introduce @XmlRootElement wrapper DTOs for collections.","Prefer JSON encoders when generic bodies are required."],"tags":["jaxb","encode","unsupported-type"],"backgroundTag":"unsupported-operation","analyzedSha":"e2a1e27560a1e68840c34f031afca88b36096e30","analyzedAt":"2026-09-10T12:37:37.238Z","contentChangedAt":"2026-09-10T12:37:37.238Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}