Skip to content

Commit

Permalink
Simplify #491 test a bit, to remove mix-ins
Browse files Browse the repository at this point in the history
  • Loading branch information
cowtowncoder committed Sep 4, 2021
1 parent 7c684f6 commit 90a06b6
Showing 1 changed file with 27 additions and 73 deletions.
Original file line number Diff line number Diff line change
@@ -1,31 +1,32 @@
package com.fasterxml.jackson.dataformat.xml.failing;

import com.fasterxml.jackson.annotation.*;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.json.JsonMapper;

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.XmlTestBase;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
* Reproduces <i>no default no-arg ctor found</i> deserialization regression introduced to {@link XmlMapper} in 2.12.0.
*
* @see <a href="https://github.com/FasterXML/jackson-dataformat-xml/issues/491">jackson-dataformat-xml issue 491</a>
*/
public class Issue491NoArgCtorDeserRegressionTest extends XmlTestBase {

public class Issue491NoArgCtorDeserRegressionTest extends XmlTestBase
{
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "type",
defaultImpl = DefaultProblem.class,
visible = true)
@JsonRootName("problem")
interface Problem {

String DEFAULT_TYPE = "about:blank";

int DEFAULT_STATUS = 500;

String getType();

int getStatus();

}

static class DefaultProblem implements Problem {
Expand All @@ -42,7 +43,8 @@ static class DefaultProblem implements Problem {
*
* @see <a href="https://github.com/FasterXML/jackson-databind/issues/1820">jackson-databind issue 1820</a>
*/
DefaultProblem(String type, Integer status) {
@JsonCreator
DefaultProblem(@JsonProperty("type") String type, @JsonProperty("status") Integer status) {
this.type = type != null ? type : Problem.DEFAULT_TYPE;
this.status = status != null ? status : Problem.DEFAULT_STATUS;
}
Expand All @@ -56,82 +58,34 @@ public String getType() {
public int getStatus() {
return status;
}

}

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "type",
defaultImpl = DefaultProblem.class,
visible = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonRootName("problem")
interface ProblemMixIn extends Problem {

@Override
@JsonProperty("type")
String getType();

@Override
@JsonProperty("status")
int getStatus();

}

abstract static class DefaultProblemMixIn extends DefaultProblem {

@JsonCreator
DefaultProblemMixIn(
@JsonProperty("type") String type,
@JsonProperty("status") Integer status) {
super(type, status);
throw new IllegalStateException(
"mix-in constructor is there only for extracting the JSON mapping, " +
"it should not have been called");
}

}

static class ProblemModule extends SimpleModule {

@Override
public void setupModule(SetupContext context) {
super.setupModule(context);
registerMixIns(context);
}

private static void registerMixIns(SetupContext context) {
context.setMixInAnnotations(DefaultProblem.class, DefaultProblemMixIn.class);
context.setMixInAnnotations(Problem.class, ProblemMixIn.class);
}

}

private static final ProblemModule MODULE = new ProblemModule();

private static final ObjectMapper JSON_MAPPER = new ObjectMapper().registerModule(MODULE);
private static final ObjectMapper JSON_MAPPER = new JsonMapper();

private static final XmlMapper XML_MAPPER = (XmlMapper) new XmlMapper().registerModule(MODULE);
private static final XmlMapper XML_MAPPER = newMapper();

/**
* Passes on 2.11.4 and 2.12.{0..4}.
*/
public void test_empty_Problem_JSON_deserialization() throws IOException {
byte[] problemJsonBytes = "{}".getBytes(StandardCharsets.UTF_8);
Problem problem = JSON_MAPPER.readValue(problemJsonBytes, Problem.class);
public void test_empty_Problem_JSON_deserialization() throws Exception
{
Problem problem = JSON_MAPPER.readValue("{}", Problem.class);
assertEquals(Problem.DEFAULT_TYPE, problem.getType());
assertEquals(Problem.DEFAULT_STATUS, problem.getStatus());
}

/**
* Passes on 2.11.4, but fails on 2.12.{0..4}.
*/
public void test_empty_Problem_XML_deserialization() throws IOException {
byte[] problemXmlBytes = "<problem/>".getBytes(StandardCharsets.UTF_8);
Problem problem = XML_MAPPER.readValue(problemXmlBytes, Problem.class);
public void test_empty_Problem_XML_deserialization() throws Exception
{
Problem problem = XML_MAPPER.readValue(
// This WOULD work:
// "<problem><status>500</status></problem>",
// but not missing
"<problem />",
Problem.class);
assertEquals(Problem.DEFAULT_TYPE, problem.getType());
assertEquals(Problem.DEFAULT_STATUS, problem.getStatus());
}

}

0 comments on commit 90a06b6

Please sign in to comment.