【问题标题】:Mule upgrade 3.6 compiler error骡子升级3.6编译报错
【发布时间】:2015-02-26 07:43:20
【问题描述】:

我正在开发 mule 3.5.1,当我升级到 mule 3.6 版本时,出现以下类的编译时错误:

import org.mule.module.jersey.MuleResponseWriter;
import com.sun.jersey.spi.container.ContainerResponse;


public class GLExportTransformer extends AbstractMessageTransformer {

    public List<GLExport> methodType(@Payload MuleResponseWriter content){
        List<GLExport> glExportList = (List<GLExport>) content;
        System.out.println("Java payload is -->"+glExportList.getClass());
        return glExportList ;
    } 

    @Override
    public Object transformMessage(MuleMessage message, String outputEncoding)throws TransformerException {
        ContainerResponse cr = (ContainerResponse) message.getInvocationProperty("jersey_response");
        List<GLExport> res = (List<GLExport>)cr.getResponse().getEntity();
        System.out.println("Response from QB is -->"+res);
        return res;   
    }

}

<custom-transformer name="StringToNameString" class="com.trinet.qb.utils.GLExportTransformer" doc:name="GL Export Transformer"/> 

编译时错误:

The type org.mule.module.jersey.MuleResponseWriter is not visible

The import com.sun.jersey cannot be resolved

我该如何解决这个问题?

在我的 Anypoint Studio 中显示 Mule3.6 使用所有与球衣相关的 jar 使用 2.11 版本的 jar 文件。使用 Java 1.7 版本。

编辑:

这是我的休息组件(GLExportService):

@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public List<GLExport> postOperation(@Payload String content) throws ParseException {
    System.out.println("Content from Reporting page-->\n\n"+content+"\n\n");
    JSONParser jsonParser = new JSONParser();
    Object jsonObjectInstance =null;
    try {
        jsonObjectInstance = jsonParser.parse(new StringReader(content));
    } catch (ParseException e) {
        System.out.println(e.getLocalizedMessage());
    }
    // parse json and assign to dto as glExportList
    return glExportList;

这是我的骡子流程:

 <http:inbound-endpoint exchange-pattern="request-response" host="${hostname}" port="${glport}" path="QBJournalExport/QBGLRest" doc:name="HTTP"/>
        <jersey:resources doc:name="REST"> 
            <component class="com.qb.rest.GLExportService"/>
        </jersey:resources> 
<set-session-variable variableName="accessToken" value="#[payload.get(0).get('ACCESS_TOKEN')]" doc:name="Access token"/>
<set-session-variable variableName="accessTokenSecret" value="#[payload.get(0).get('ACCESS_TOKEN_SECRET')]" doc:name="Access Secret"/>
<set-session-variable variableName="realmId" value="#[payload.get(0).get('ACCT_SYSTEM_COMPANY_ID')]" doc:name="Company ID"/>
<set-session-variable variableName="quickbooksClient" value="#[com.qb.utils.QuickbooksUtils.getQuickbooksClient(sessionVars['accessToken'],sessionVars['accessTokenSecret'],'${consumerKey}','${consumerSecret}','${appToken}',sessionVars['realmId'])]" doc:name="QB Client"/>
<custom-transformer name="StringToNameString" class="com.qb.utils.GLExportTransformer" doc:name="GL Export Transformer"/>
<set-payload value="#[com.qb.utils.CreateJournalEntry.createJournalEntry(payload,sessionVars['accessToken'],sessionVars['accessTokenSecret'],'${consumerKey}','${consumerSecret}','${appToken}', sessionVars['realmId'])]" doc:name="Create Journal Entry"/>

【问题讨论】:

    标签: java rest jersey mule


    【解决方案1】:
    import org.glassfish.jersey.server.ContainerResponse;
    
    public class GLExportTransformer extends AbstractMessageTransformer {
    
        @Override
        public Object transformMessage(MuleMessage message, String outputEncoding)throws TransformerException {
            ContainerResponse cr = (ContainerResponse) message.getInvocationProperty("jersey_response");
            List<GLExport> res = (List<GLExport>)cr.getEntity();
            return res;   
        }
    
    }
    

    名为 methodType 的方法是一个伪代码。

    【讨论】:

      【解决方案2】:

      尝试将参数类型设为java.util.Object,然后删除导入。无论如何,您都会立即将其转换为 List&lt;GLExport&gt;,因此您似乎不需要那种类型。

      【讨论】:

      • transformMessage 是一个被覆盖的方法,改变参数会导致编译错误。
      • 您需要完成的主要工作是根据您从客户端收到的 JSON 生成一个 List。如果您希望客户端发布 List 的 JSON 表示,您可以在 之前使用 或者只是改变 postOperation 方法中的参数类型,看看 jersey 是否会为你转换它。
      • 你说在postOperation方法中改变参数类型,看看jersey会不会帮你改造,改什么?我的输入数据,即字符串内容是字符串格式的 json 数据
      • 尝试将其更改为 List。我认为泽西岛已经内置了杰克逊编组......如果没有,你总是可以在资源元素之前使用 json 转换器。
      【解决方案3】:

      我们确实只制作了 MuleResponseWriter 包,但这不是问题的根源。在 Mule 3.6 中,我们从 Jersey 1.6 升级到了 2.11。 Jersey 2 完全不同,它甚至包括一个从 com.sun.jersey 重命名为 org.glassfish.jersey 的包。您可以在这篇文章中找到有关升级的更多信息,包括指向 Jersey 迁移指南的链接:http://blogs.mulesoft.org/mule-3-6-api/

      我还是不明白,为什么你需要在你的转换器中访问 ContainerResponse 而不是让你的球衣资源直接将消息有效负载设置为列表。

      问候

      【讨论】:

      • 我也有同样的问题。关于 Jersey 模块的旧文档建议以上述方式使用 ContainerResponse “将请求从您的球衣组件转换或发送到下一个资源/流”。请参阅此页面的最底部链接:mulesoft.org/documentation/display/34X/Jersey+Module+Reference
      • 更新了 mule 流程和组件。输入是来自一个系统的 json 数据,该系统调用 rest 组件并从 rest 发送/接收数据并上传到基于云的应用程序-QuickBooks
      【解决方案4】:

      似乎他们只制作了 org.mule.module.jersey.MuleResponseWriter 类包。

      这可能是因为该类从来不是公共 Mule API 的一部分,或者只是轻微的拼写错误。

      无论如何,就目前而言,您无能为力。 唯一的技巧是将转换器和任何引用 org.mule.module.jersey.MuleResponseWriter 的类放在一个名为: org.mule.module.jersey

      但这是一个 HACK,我不建议这样做。 我会尝试找出是否是故意制作的,并让你知道;)

      【讨论】:

        猜你喜欢
        • 2021-06-03
        • 2023-01-31
        • 2014-08-10
        • 1970-01-01
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        • 2018-06-27
        • 2012-07-26
        相关资源
        最近更新 更多