简体   繁体   English

使用Mule和Jersey修改JSON输出

[英]Modify the JSON output with Mule and Jersey

My goal is stupidly simple. 我的目标很愚蠢。 I just want to wrap a json response from Jersey module in Mule in a JSON response such that: 我只想在Jule响应中将来自Mule的Jersey模块的json响应包装起来,这样:

{"status": "ok", message:<json-message>}

I tried to use a custom-transformer: 我试着使用自定义变换器:

<flow name="sicsRest" doc:name="sicsRest">
    <inbound-endpoint address="http://localhost:65432/RestServices" 
        exchange-pattern="request-response" doc:name="RestEntry" />
    <jersey:resources doc:name="REST">
        <component doc:name="Java">
            <spring-object bean="serviceImpl" />
        </component>
        <custom-transformer returnClass="java.lang.String" 
            class="com.hyperborea.sicsbus.transformer.JsonTransformer" 
            doc:name="JsonTransformer" />
        <jersey:exception-mapper 
            class="com.hyperborea.sicsbus.exception.JsonRestExceptionMapper" />
    </jersey:resources>
</flow>

The transformer class: 变压器类:

public class JsonTransformer extends AbstractTransformer {
    @Override 
    protected Object doTransform(Object src, String enc) 
    throws TransformerException {
        return "{\"status\":\"ok\", \"message\":\"" + src + "\"}";
    }
}

Unfortunately it raises an exception during Mule startup: 不幸的是,它在Mule启动期间引发了异常:

org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'custom-transformer'. One of '{"http://www.mulesoft.org/schema/mule/core":abstract-component, "http://www.mulesoft.org/schema/mule/jersey":exception-mapper}' is expected.

Any suggestion? 有什么建议吗?

What if you place your custom-transformer in a <response> ... </response> block between the inbound-endpoint and the jersey:resources ? 如果将custom-transformer放在inbound-endpointjersey:resources之间的<response> ... </response>块中,该怎么办?

EDIT 编辑

New flow: 新流程:

<flow name="sicsRest" doc:name="sicsRest">
    <inbound-endpoint ... />
    <response>
        <custom-transformer returnClass="java.lang.String"
            class="com.hyperborea.sicsbus.transformer.JsonTransformer"
            doc:name="JsonTransformer" />
    </response>
    <jersey:resources doc:name="REST">
        <component doc:name="Java">
            <spring-object bean="serviceImpl" />
        </component>
        <jersey:exception-mapper ... />
    </jersey:resources>
</flow>

The transformer has to be changed in an AbstractMessageTransformer in order to better handle the input (which is almost impossibile with AbstractTransformer): 必须在AbstractMessageTransformer中更改变换器才能更好地处理输入(使用AbstractTransformer几乎无法实现):

public class JsonTransformer extends AbstractMessageTransformer {
    @Override 
    public Object transformMessage(MuleMessage message, String outputEncoding)
    throws TransformerException {
        try {
            return "{\"status\":\"ok\", \"message.getPayloadAsString()\":\"" 
            + src + "\"}";
        } catch (Exception e) {}
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM