【问题标题】:How to @Inject fastxml.jackson.ObjectMapper into JAX-RS Resource?如何@Inject fasterxml.jackson.ObjectMapper 到 JAX-RS 资源中?
【发布时间】:2014-07-30 14:03:45
【问题描述】:

我正在尝试将 ObjectMapper 类的一个实例注入到我的 JAX-RS 资源中,但我看到了这个错误,

[ERROR   ] Api type [com.fasterxml.jackson.databind.ObjectMapper] is not found with the qualifiers 
Qualifiers: [@javax.enterprise.inject.Default()]
for injection into Field Injection Point, field name :  mapper, Bean Owner : [PageMetaResource, Name:null, WebBeans Type:MANAGED, API Types:[com.lmig.pi.ado.meta.resources.PageMetaResource], Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]]

我在 WEB-INF 目录中有一个空 beans.xml 文件,

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

我想知道我的 Application.getSingletons() 方法是否导致了问题,

@Override
public Set<Object> getSingletons()
{
    Set<Object> set = new HashSet<>();

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

    ObjectMapper mapper = new ObjectMapper();

    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    mapper.configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, false);
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.setDateFormat(df);

    JacksonJsonProvider provider = new JacksonJsonProvider();
    provider.setMapper(mapper);

    set.add(provider);

    return set;
}

我的资源类是这样的,

public class PageMetaResource extends BasePresentationResource
{
    /**
     * The logger of the class
     */
    private static final Logger logger = Logger.getLogger(PageMetaResource.class);

    /**
     * Factory that produces a {@link PageMetaServices} instance for this resource.
     */
    private ServiceFactory serviceFactory;

    /**
     * Factory that produces a {@link PageMetaResourceBean} instance for this resource.
     */
    private ResourceBeanFactory resourceBeanFactory;

    /**
     * The servlet context.
     */
    @Context
    private ServletContext context;

    @Inject
    private ObjectMapper mapper;

    /**
     * Constructor
     */
    @Inject
    public PageMetaResource(ServiceFactory serviceFactory, ResourceBeanFactory resourceBeanFactory)
    {
        this.serviceFactory = serviceFactory;        
        this.resourceBeanFactory = resourceBeanFactory;
    }
...
}

有什么想法吗?我尝试将 @inject 注入构造函数 - 但引发了类似的错误。

感谢您的帮助,

安德鲁

PS:我正在部署到 Websphere Application Server v8.5 Liberty Profile

【问题讨论】:

    标签: java jackson websphere cdi


    【解决方案1】:

    您的 CDI 容器没有找到 ObjectMapper 的生产者。看看here

    【讨论】:

    • 这样就更清楚了。 ObjectMapper 没有“内置”生产者,您必须自己提供一个。
    • 其实如果你包含jackson-jaxrs-json-provider模块(来自github.com/FasterXML/jackson-jaxrs-providers),它应该是自动注册的。尽管您可能仍希望明确地获取自定义配置。
    猜你喜欢
    • 2016-09-25
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    相关资源
    最近更新 更多