Mule:在 spring bean 上设置 属性
Mule: Setting a property on a spring bean
我正在使用 Mule v3.5.0
目前我有一个名为 flowContextEnricher 的 bean,它将一个对象设置为一个包含一些关于流的信息的 eventContext 会话。此信息稍后用于审核日志记录:
@Component
public abstract class AbstractContextEnricher implements Callable {
public Stream buildStream() {
final Stream stream = ...
return stream;
}
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
final Stream stream = buildStream();
eventContext.getSession().setProperty("stream", stream);
return eventContext.getMessage().getPayloadAsString();
}
我想将此 ContextEnricher 重用于在线服务和模拟服务,但对于模拟服务,必须将额外的布尔值 属性 模拟设置为 'TRUE'。
我可以通过添加一个单独的增强器来做到这一点:MockContectEnricher:
@Component
public class MockContextEnricher implements Callable {
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
eventContext.getSession().setProperty("mock", Boolean.TRUE);
return eventContext.getMessage().getPayloadAsString();
}
}
然后我必须为所有模拟流程调用附加组件。我的总流量是这样的:
<flow name="xxxFlowMock" processingStrategy="synchronous">
<servlet:inbound-endpoint path="/xxx/mock" responseTimeout="10000" />
<component>
<spring-object bean="mockContextEnricher"/>
</component>
<component>
<spring-object bean="xxxContextEnricher"/>
</component>
<component>
<spring-object bean="auditLogger"/>
</component>
...
</flow>
这可行,但看起来有点奇怪。难道不能将 xxxContextEnricher 重用于在线服务和模拟服务,并且只在 bean 上设置一个 属性 吗?
<property name="mock" value="true">
实现它的最佳方法是什么?
再有一个 MockContextEnricher
应该不会太糟糕。虽然我认为如果 MockContextEnricher
class 只是扩展 xxxContextEnricher
,你可以做得更好。这样,你就可以拥有这样的东西了。
@Component
public class MockContextEnricher extends xxxContextEnricher {
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
eventContext.getSession().setProperty("mock", Boolean.TRUE);
return super.onCall(eventContext);
}
}
或者,如果您想真正删除 MockContextEnricher
。试试这个。
将字段(可能是布尔类型)添加到 xxxContextEnricher
class 用于 'mock' 属性,添加使用它有条件地添加 'mock' 会话 属性。
示例初始化:
<spring:bean id="mockContextEnricher" name="mockContextEnricher" class="com.example.xxxContextEnricher">
<spring:property name="mock" value="true"/>
</spring:bean>
...
<flow name="xxxFlowMock" processingStrategy="synchronous">
<servlet:inbound-endpoint path="/xxx/mock" responseTimeout="10000" />
<component>
<spring-object bean="mockContextEnricher"/>
</component>
<component>
<spring-object bean="auditLogger"/>
</component>
...
</flow>
现在我通过向每个模拟流添加一个 message-properties-transformer 组件来解决它。默认情况下,如果未指定,我将其设置为 false,仅在模拟流程中我将 属性 设置为 true。
<message-properties-transformer scope="session">
<add-message-property key="mock" value="true"/>
</message-properties-transformer>
尽管如此,通过 spring-bean 对象设置它会更清晰...
我正在使用 Mule v3.5.0
目前我有一个名为 flowContextEnricher 的 bean,它将一个对象设置为一个包含一些关于流的信息的 eventContext 会话。此信息稍后用于审核日志记录:
@Component
public abstract class AbstractContextEnricher implements Callable {
public Stream buildStream() {
final Stream stream = ...
return stream;
}
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
final Stream stream = buildStream();
eventContext.getSession().setProperty("stream", stream);
return eventContext.getMessage().getPayloadAsString();
}
我想将此 ContextEnricher 重用于在线服务和模拟服务,但对于模拟服务,必须将额外的布尔值 属性 模拟设置为 'TRUE'。
我可以通过添加一个单独的增强器来做到这一点:MockContectEnricher:
@Component
public class MockContextEnricher implements Callable {
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
eventContext.getSession().setProperty("mock", Boolean.TRUE);
return eventContext.getMessage().getPayloadAsString();
}
}
然后我必须为所有模拟流程调用附加组件。我的总流量是这样的:
<flow name="xxxFlowMock" processingStrategy="synchronous">
<servlet:inbound-endpoint path="/xxx/mock" responseTimeout="10000" />
<component>
<spring-object bean="mockContextEnricher"/>
</component>
<component>
<spring-object bean="xxxContextEnricher"/>
</component>
<component>
<spring-object bean="auditLogger"/>
</component>
...
</flow>
这可行,但看起来有点奇怪。难道不能将 xxxContextEnricher 重用于在线服务和模拟服务,并且只在 bean 上设置一个 属性 吗?
<property name="mock" value="true">
实现它的最佳方法是什么?
再有一个 MockContextEnricher
应该不会太糟糕。虽然我认为如果 MockContextEnricher
class 只是扩展 xxxContextEnricher
,你可以做得更好。这样,你就可以拥有这样的东西了。
@Component
public class MockContextEnricher extends xxxContextEnricher {
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
eventContext.getSession().setProperty("mock", Boolean.TRUE);
return super.onCall(eventContext);
}
}
或者,如果您想真正删除 MockContextEnricher
。试试这个。
将字段(可能是布尔类型)添加到 xxxContextEnricher
class 用于 'mock' 属性,添加使用它有条件地添加 'mock' 会话 属性。
示例初始化:
<spring:bean id="mockContextEnricher" name="mockContextEnricher" class="com.example.xxxContextEnricher">
<spring:property name="mock" value="true"/>
</spring:bean>
...
<flow name="xxxFlowMock" processingStrategy="synchronous">
<servlet:inbound-endpoint path="/xxx/mock" responseTimeout="10000" />
<component>
<spring-object bean="mockContextEnricher"/>
</component>
<component>
<spring-object bean="auditLogger"/>
</component>
...
</flow>
现在我通过向每个模拟流添加一个 message-properties-transformer 组件来解决它。默认情况下,如果未指定,我将其设置为 false,仅在模拟流程中我将 属性 设置为 true。
<message-properties-transformer scope="session">
<add-message-property key="mock" value="true"/>
</message-properties-transformer>
尽管如此,通过 spring-bean 对象设置它会更清晰...