簡體   English   中英

為Google App Engine配置Jackson

[英]Configure Jackson for Google App Engine

有沒有辦法配置用於序列化servlet響應的JacksonConfiguredObjectMapper )?

@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);配置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>

看起來您正在使用Cloud Endpoints Frameworks ,它不使用Jackson注釋。 在您的情況下,您將使用ApiTransformer來實現您想要的效果。 舉個例子:

@ApiTransformer(RatesEnvelopeTransformer.class)
public class RatesEnvelope {
    private BigDecimal someBigDecimalField;
    // ...
}

public class RatesEnvelopeTransformer implements Transformer<BigDecimal, String> {
    public String transformTo(BigDecimal in) {
        return in.toPlainString();
    }

    public BigDecimal transformFrom(String in) {
        return new BigDecimal(in);
    }
}

創建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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM