java - 为 Google App Engine 配置 Jackson

标签 java json google-app-engine jackson

有什么方法可以配置用于序列化 servlet 响应的 Jackson (ConfiguredObjectMapper)?

@Api(name = "rates",
        version = "v1",
        title = "Rates API")
public class RatesApi {
    static Logger LOG = Logger.getLogger(RatesApi.class.getSimpleName());

    @ApiMethod(name = "getLatestRates",
            path = "latest",
            httpMethod = HttpMethod.GET)
    public RatesEnvelope getLatestRates(@Named("base") String base) throws BadRequestException,
            InternalServerErrorException {

        try {
            RatesInfo ratesInfo = DatabaseUtils.getLatestRates(base);
            return new RatesEnvelope(ratesInfo.getDate(), base, ratesInfo.getTimestamp(), ratesInfo.getRates());
        } catch (IllegalArgumentException e) {
            throw new BadRequestException(e.getMessage());
        } catch (com.googlecode.objectify.NotFoundException e) {
            throw new InternalServerErrorException("no available rates");
        }
    }
}

我的问题是 RatesEnvelope 类包含 BigDecimal 字段,应该配置 mapper.enable(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN); 以避免 E 符号。

web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
        <servlet-name>CurrencyWebserviceServlet</servlet-name>
        <servlet-class>PACKAGE_NAME.backend.servlet.OpenExchangeRatesWebserviceServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>SystemServiceServlet</servlet-name>
        <servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class>
        <init-param>
            <param-name>services</param-name>
            <param-value>PACKAGE_NAME.backend.spi.RatesApi</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>CurrencyWebserviceServlet</servlet-name>
        <url-pattern>/cron/fetchlatest</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>SystemServiceServlet</servlet-name>
        <url-pattern>/_ah/spi/*</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>all</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

    <filter>
        <filter-name>ObjectifyFilter</filter-name>
        <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ObjectifyFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <!-- Next three lines are for request dispatcher actions -->
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
</web-app>

最佳答案

创建 Jackson ObjectMapper 实例。通过启用或禁用您需要的功能来根据需要进行配置。修改您的 Spring 配置以使用它而不是默认配置。 Java 配置看起来像这样:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    final ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN);
    converter.setObjectMapper(objectMapper);
    converters.add(converter);
    super.configureMessageConverters(converters);
}

关于java - 为 Google App Engine 配置 Jackson,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42327779/

相关文章:

javascript - 在javascript中迭代对象数组

php从函数返回json编码的字符串

python - 上传带有 Google App Engine 问题的应用程序

java - 如何在 Mac 上设置 Logback?

javascript - 进行 Ajax 调用的其他方法有哪些?

java - swing应用程序支持动态代码编译吗?

java - 谷歌应用程序引擎实体中的 Joda Time

google-app-engine - Google Cloud Console 日志记录中的正则表达式

java - 限制 Eclipse 的 RAM 使用

java - 使用流对内部对象的 Map 属性进行分组?