You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Tim Lark (JIRA)" <ji...@apache.org> on 2017/10/31 19:50:00 UTC

[jira] [Created] (CAMEL-11970) JacksonDataFormat does not pickup custom ObjectMapper from Registry

Tim Lark created CAMEL-11970:
--------------------------------

             Summary: JacksonDataFormat does not pickup custom ObjectMapper from Registry
                 Key: CAMEL-11970
                 URL: https://issues.apache.org/jira/browse/CAMEL-11970
             Project: Camel
          Issue Type: Bug
          Components: camel-jackson
    Affects Versions: 2.20.0, 2.19.3, 2.19.2
         Environment: Spring Boot 1.5.7.RELEASE
org.apache.camel:*2.19.2

A SpringRouteBuilder bean:
{code:java}
@Component
public class CustomerCreatedRoutes extends SpringRouteBuilder
{
    @Value("${spring.application.name}")
    private String groupId;

    private final Helper helper;

    @Autowired
    public CustomerCreatedRoutes(Helper helperParm)
    {
        helper = helperParm;
    }

    @Override
    public void configure() throws Exception
    {
        KafkaTopics.DomainEvent eventType = KafkaTopics.DomainEvent.CUSTOMER_CREATED;

        from(eventType.buildConsumerUri(groupId)) //
                .routeId(eventType.getDefaultRouteId()) //
                .unmarshal() //
                .json(JsonLibrary.Jackson, eventType.getPayloadClass()) //
                .id(eventType.getDefaultUnmarshalId()) //
                .bean(helper, "createDefaultPolicy") //
                .end();
    }
}
{code}
            Reporter: Tim Lark
             Fix For: 2.19.4, 2.20.1


When a custom ObjectMapper is properly configured as a Spring bean and exists in the Registry, it is ignored when the {{JacksonDataFormat.doStart}} method is invoked.

The beginning of this method does a null check on {{objectMapper}} and simply creates one via {{new ObjectMapper()}} if null.

I've prototyped a more robust solution below, which does pickup our custom ObjectMapper bean:
+Before:+
{code:java}
    @Override
    protected void doStart() throws Exception {
        if (objectMapper == null) {
            objectMapper = new ObjectMapper();
        }
...
{code}

+After:+
{code:java}
    @Override
    protected void doStart() throws Exception {
        if (objectMapper == null) {
            CamelContext context = getCamelContext();
            if (context == null) {
                LOG.error("doStart: No camelContext defined");
            }
            else {
                Map<String, ObjectMapper> mappersByName = context
                        .getRegistry()
                        .findByTypeWithName(ObjectMapper.class);
                LOG.debug("doStart: Found objectMappers={}", mappersByName);
                if (mappersByName.size() >= 1) {
                    Map.Entry<String, ObjectMapper> mapperByName = mappersByName
                            .entrySet()
                            .iterator()
                            .next();
                    objectMapper = mapperByName.getValue();
                    LOG.debug("doStart: Using objectMapper=[name:{}, {}]", mapperByName.getKey(), objectMapper);
                }
            }
            if (objectMapper == null) {
                objectMapper = new ObjectMapper();
                LOG.warn("doStart: Using new default objectMapper={}", objectMapper);
            }
        }
...
{code}

An enhancement to this would be to allow the *bean name* to be specified instead of simply choosing the first one found.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)