Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-12062

Jaxb component does not communicate charset when explicitly set

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 2.20.1
    • Fix Version/s: 2.21.0
    • Component/s: camel-jaxb
    • Labels:
      None
    • Patch Info:
      Patch Available
    • Estimated Complexity:
      Unknown

      Description

      This test will cause a UnmappableCharacterException, since jaxb does not communicate the encoding of the bytes it outputs causing the file endpoint to assume it is UTF-8.

      This can be mitigated by adding an explicit reader in the route, but it would be nice if it worked OOTB.

      /**
       * @version 
       */
      public class ExplicitFileEncodingTest extends CamelTestSupport {
      
          @Override
          public void setUp() throws Exception {
              deleteDirectory("target/charset");
              super.setUp();
          }
      
          @Test
          public void testISOFileEncoding() throws Exception {
              PurchaseOrder order = new PurchaseOrder();
              //Data containing characters ÆØÅæøå that differ in utf-8 and iso
              String name = "\u00c6\u00d8\u00C5\u00e6\u00f8\u00e5";
              order.setName(name);
              order.setAmount(123.45);
              order.setPrice(2.22);
      
              MockEndpoint result = getMockEndpoint("mock:file");
              result.expectedFileExists("target/charset/output.txt");
      
              template.sendBody("direct:start", order);
              assertMockEndpointsSatisfied();
      
              JAXBContext jaxbContext = JAXBContext.newInstance("org.apache.camel.example");
              Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
              PurchaseOrder obj = (PurchaseOrder)unmarshaller.unmarshal(new File("target/charset/output.txt"));
              assertEquals(obj.getName(), name);
          }
      
          @Override
          protected RouteBuilder createRouteBuilder() throws Exception {
              return new RouteBuilder() {
                  @Override
                  public void configure() throws Exception {
                      JaxbDataFormat jaxb = new JaxbDataFormat("org.apache.camel.example");
                      jaxb.setEncoding("iso-8859-1");
      
                      from("direct:start")
                              .marshal(jaxb)
                              .to("file:target/charset/?fileName=output.txt&charset=iso-8859-1");
                  }
              };
          }
      
      }
      

        Attachments

          Activity

            People

            • Assignee:
              acosentino Andrea Cosentino
              Reporter:
              MadMod Jonas Waage
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: