TLDR; - include also the imported xsd file in the schema sources in xml unit validator

When trying to validate an xml document against an xsd schema with xmlunit I get the following exception

org.xmlunit.XMLUnitException: The schema is invalid

	at org.xmlunit.validation.JAXPValidator.validateInstance(JAXPValidator.java:81)
	at ch.mobi.siefs.connector.helper.XmlUnitComparisonTest.givenXml_whenValidatesAgainstXsd_thenCorrect(XmlUnitComparisonTest.java:48)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
.....
Caused by: org.xml.sax.SAXParseException; lineNumber: 89; columnNumber: 98; src-resolve: Cannot resolve the name 'mobits:HistoryTimestamp' to a(n) 'type definition' component.
	at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:204)
	at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:135)
....

The unit test looked like the following:

@Test
public void givenXml_whenValidatesAgainstXsd_thenCorrect() {
  Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
  v.setSchemaSource(Input.fromStream(
          XmlUnitComparisonTest.class.getResourceAsStream("xsd/bookmark.xsd")).build());
  ValidationResult r = v.validateInstance(Input.fromStream(
          XmlUnitComparisonTest.class.getResourceAsStream("message/bookmark-example.xml")).build());
  Iterator<ValidationProblem> probs = r.getProblems().iterator();
  while (probs.hasNext()) {
    probs.next().toString();
  }
  Assertions.assertThat(r.isValid()).isTrue();
}

The problem element mentioned in the stack trace comes from the imported xsd, which xml wise everything seems ok:

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:common="http://xml.bookmarks.dev/datatype/common/Commons/v3">
    <xsd:import namespace=""http://xml.bookmarks.dev/datatype/common/Commons/v3" schemaLocation="common-Commons-3.0.xsd"/>

The solution was to add also the imported xsd schema when building the validator in xmlunit

  @Test
  public void givenXml_whenValidatesAgainstXsd_thenCorrect() {
    Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
    v.setSchemaSources( // order of xsd sources is important
        Input.fromStream(
                getClass().getClassLoader().getResourceAsStream("xsd/bookmarks.xsd"))
            .build(),
        Input.fromStream(
                getClass().getClassLoader().getResourceAsStream("xsd/common-Commons-3.0.xsd"))
            .build());
    ValidationResult r =
        v.validateInstance(
            Input.fromStream(
                    getClass()
                        .getClassLoader()
                        .getResourceAsStream("message/bookmark-example.xml"))
                .build());
    Iterator<ValidationProblem> probs = r.getProblems().iterator();
    while (probs.hasNext()) {
      probs.next().toString();
    }
    assertThat(r.isValid()).isTrue();
  }

Shared with from Codever. 👉 Use the Copy to mine functionality to copy this snippet to your own personal collection and easy manage your code snippets.

Codever is open source on Github ⭐🙏

Use MediaType.TEXT_PLAIN in the @Consumes annotation and then you have access to the text content as string

    @POST
    @Path("organisation")
    @Consumes(MediaType.TEXT_PLAIN)
    @ApiOperation(value = "Create bookmark from text")
    @ApiResponses({
            @ApiResponse(code = 201, message = "Bookmark successfully created.", response = Bookmark.class),
            @ApiResponse(code = 403, message = "Forbidden")
    })
    public Response createBookmark(@ApiParam("Bookmark") String boookmark, @Context UriInfo uriInfo) throws JAXBException {
        Bookmark created = bookmarkService.createBookmarkFromString(bookmark);
        UriBuilder builder = uriInfo.getAbsolutePathBuilder();
        builder.path(created.getUuid().toString());
        return Response.created(builder.build()).build();
    }

Shared with from Codever. 👉 Use the Copy to mine functionality to copy this snippet to your own personal collection and easy manage your code snippets.

Codever is open source on Github ⭐🙏

Enable the inspector by using --inspect option and giving it a port number to listen on as in the following example (here 9230)

  "scripts" : {
    "start": "nodemon  --inspect=9230 ./bin/www"
  }

Reference - https://nodejs.org/en/docs/guides/debugging-getting-started/


Shared with from Codever. 👉 Use the Copy to mine functionality to copy this snippet to your own personal collection and easy manage your code snippets.

Codever is open source on Github ⭐🙏

Issue the following command in terminal:

docker exec -it YOUR_IMAGE bash

Once in bash issue the following command, and you are there:

sqlplus YOUR_USERNAME/USERNAME_PASSWORD@localhost:1521/XE

Shared with from Codever. 👉 Use the Copy to mine functionality to copy this snippet to your own personal collection and easy manage your code snippets.

Codever is open source on Github ⭐🙏

Use the getClass().getClassLoader().getResourceAsStream() to get an InputStream for the wanted resource. In the following snippet we access the bookmark-example.xml file resource, which is placed directly in the src/test/resources folder:

@Test
void shouldUnmarshallXmlToJava() throws JAXBException {
    JAXBContext jaxbContext = JAXBContext.newInstance("dev.codepal.bookmark");
    final var jaxbUnmarshaller = jaxbContext.createUnmarshaller();

    InputStream inStream = getClass().getClassLoader().getResourceAsStream(
            "bookmark-example.xml");

    JAXBElement<Bookmark> o = (JAXBElement<Bookmark>)jaxbUnmarshaller.unmarshal(inStream);
    Bookmark bookmark = o.getValue();
    assertThat(bookmark.getTitle(), equalTo("CodepediaOrg"));
}

Shared with from Codever. 👉 Use the Copy to mine functionality to copy this snippet to your own personal collection and easy manage your code snippets.

Codever is open source on Github ⭐🙏