簡體   English   中英

澤西利用錯誤的郵件正文編寫程序提供程序

[英]Jersey Utilizing Wrong Message Body Writer Provider

我最近開始使用jersey 1.6開發Rest Web服務。 我有2個正在生成JSON的服務。 我為他們兩個都設置了MessageBodyWriters來處理對象到Json的轉換。 我完成了我的第一個Web服務,並且一切正常,並且按預期進行。 當嘗試實現我的第二個服務時,我遇到了一個問題,即Jersey調用了我為第一個Web服務設置的messagebodywriter提供程序,而不是我創建的新服務。 這將生成類強制轉換異常。 如果我從第一項服務中刪除了提供程序,以便只有第二項服務在那兒,那么它將按預期工作。 以下是我的設置:

服務1

  @POST
    @Path("/medical")
    @Produces(MediaType.APPLICATION_JSON)
    public RateListWrapper getMedicalRate(@FormParam("zip") String zip, @FormParam("cpt")     List<String> cptList, @FormParam("dos") String dos, @FormParam("mod1") List<String> mod1List, 
            @FormParam("mod2") List<String> mod2List, @FormParam("mod3") List<String> mod3List, @FormParam("mod4") List<String> mod4List, @FormParam("units") List<String> unitsList,
            @FormParam("pos") List<String> posList) {
    }

服務第一提供商

@Provider
public class RateListWraperProvider implements MessageBodyWriter<RateListWrapper>{

    @Override
    public long getSize(RateListWrapper t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        //System.out.println("Get Size");
        return -1;
    }

    @Override
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        //System.out.println("Is Writable");
        return true;
    }

    @Override
    public void writeTo(RateListWrapper t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {

        final GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setDateFormat("yyyy-MM-dd");
        Gson gson = gsonBuilder.serializeNulls().create();
        entityStream.write(gson.toJson(t).getBytes());

    }

}

服務#2

@POST
@Path("/medical/post")
@Produces(MediaType.APPLICATION_JSON)
public RbrvsListWrapper medicalRatePost(@FormParam("zip") String zip, @FormParam("facilitytype") String facilityType, @FormParam("cpt") List<String> cptList, @FormParam("dos") String dos, @FormParam("mod1") List<String> mod1List) {
    return getMedicalRate(zip, facilityType, cptList, dos, mod1List);
}

服務#2提供者

@Provider
public class RbrvsListWrapperProvider implements MessageBodyWriter<RbrvsListWrapper>{

    @Override
    public long getSize(RbrvsListWrapper t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        //System.out.println("Get Size");
        return -1;
    }

    @Override
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        //System.out.println("Is Writable");
        return true;
    }

    @Override
    public void writeTo(RbrvsListWrapper t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {

        final GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setDateFormat("yyyy-MM-dd");
        Gson gson = gsonBuilder.serializeNulls().create();
        entityStream.write(gson.toJson(t).getBytes());

    }



}

這是我的web.xml中的Jersey配置:

  <servlet>
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>
                     com.sun.jersey.spi.container.servlet.ServletContainer
                </servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.dataws</param-value>
    </init-param>
    <init-param>
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>jersey-serlvet</servlet-name>
    <url-pattern>/ws/*</url-pattern>
  </servlet-mapping>

更新

我升級到1.17,問題仍然存在。 這是類強制轉換異常發生的堆棧跟蹤

java.lang.ClassCastException: com.dataws.json.RbrvsListWrapper cannot be cast to com.dataws.json.RateListWrapper
    at com.dataws.provider.RateListWraperProvider.getSize(RateListWraperProvider.java:1)
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:289)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1479)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

使用@maslim建議,並使用Jackson創建JSON。 刪除了我的自定義提供程序,並且兩種服務現在都可以正常運行。

暫無
暫無

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

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