¿Cómo se convierte en un cuerpo de solicitud @RestController a una lista de valores abstractos?

dukethrash:

Digamos que tenemos las siguientes clases:

public abstract class Investment {

   private String investmentType;

   // getters & setters
}

public class Equity extends Investment {
}

public class Bond extends Investment {
}

public class InvestmentFactory {

    public static Investment getTypeFromString(String investmentType) {
        Investment investment = null;
        if ("Bond".equals(investmentType)) {
            investment = new Bond();
        } else if ("Equity".equals(investmentType)) {
            investment = new Equity();
        } else {
            // throw exception
        }
        return investment;
    }
}

Y lo siguiente @RestController:

@RestController
public class InvestmentsRestController {

    private InvestmentRepository investmentRepository;

    @Autowired
    public InvestmentsRestController(InvestmentRepository investmentRepository) {
        this.investmentRepository = investmentRepository;
    }

    @RequestMapping(RequestMethod.POST)
    public List<Investment> update(@RequestBody List<Investment> investments) {
       return investmentRepository.update(investments);
    }

}

Y el siguiente JSON en el cuerpo de la petición:

[
  {"investmentType":"Bond"},
  {"investmentType":"Equity"}
]

¿Cómo puedo convertir el aprieto o JSON a un cuerpo de solicitud de List<Investment>sin usar Jackson @JsonSubTypesen la clase abstracta Investment, y en lugar de utilizar el InvestmentFactory?

Joe A:

@JsonDeserialize funciona muy bien, pero si usted tiene más campos que sólo el tipo, entonces tendrá que configurar manualmente todos ellos. Si se va a volver a Jackson, puede utilizar:

Investment.class

    @JsonTypeInfo(
            use = JsonTypeInfo.Id.NAME,
            include = JsonTypeInfo.As.PROPERTY,
            property = "investmentType")
    @JsonTypeIdResolver(InvestmentResolver.class)
    public abstract class Investment {
    } 

InvestmentResolver.class

public class InvestmentResolver extends TypeIdResolverBase {

    @Override
    public JavaType typeFromId(DatabindContext context, String id) throws IOException {
        Investment investment = InvestmentFactory.getTypeFromString(type);
        return context.constructType(investment.getClass());
    }

La belleza de esto es que si usted comienza a añadir campos a la Inversión que no tendrá que añadirlos en el Desrializer (al menos, esto me pasó en mi caso), pero en lugar de Jackson se hará cargo de él para usted. Así que mañana puede hacer que el caso de prueba:

'[{"investmentType":"Bond","investmentName":"ABC"},{"investmentType":"Equity","investmentName":"APPL"}]'

¡Usted debe ser bueno para ir!

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=168599&siteId=1
Recomendado
Clasificación