小编Dan*_*iel的帖子

具有不同参数的策略模式

我在使用策略模式时遇到了一个问题.我正在实现创建任务的服务.此服务还解决了此任务的负责人员.解决职员是通过使用策略模式来完成的,因为有不同的方法可以做到这一点.关键是每个策略都需要不同的参数来解决职员.

例如:

interface ClerkResolver {
    String resolveClerk(String department);
}

class DefaultClerkResolver implements ClerkResolver {

    public String resolveClerk(String department) {
        // some stuff
    }
}

class CountryClerkResolver implements ClerkResolver {

    public String resolveClerk(String department) {
        // I do not need the department name here. What I need is the country.
    }

}
Run Code Online (Sandbox Code Playgroud)

问题是每个解析器可能依赖于不同的参数来解决负责的职员.对我来说,这听起来像是我的代码中的设计问题.我还尝试将一个类作为参数来保留策略可能需要的所有值,例如:

class StrategyParameter {

   private String department;
   private String country;

   public String getDepartment() ...
}

interface ClerkResolver {
    String resolveClerk(StrategyParameter strategyParameter);
}
Run Code Online (Sandbox Code Playgroud)

但说实话,我对这个解决方案并不满意,因为每当策略需要一个新的/不同的参数时我就必须更改参数类.其次,策略的调用者必须设置所有参数,因为他不知道哪个策略将解析职员,因此他必须提供所有参数(但这并不是那么糟糕).

同样,对我而言,这听起来像我的代码中的设计问题,但我找不到更好的解决方案.

---编辑

此解决方案的主要问题是创建任务时.任务服务如下所示:

class TaskService { …
Run Code Online (Sandbox Code Playgroud)

java design-patterns strategy-pattern taskservice

18
推荐指数
2
解决办法
1万
查看次数

在WAR创建之前使用gradle添加生成的文件

在开发过程中,我们使用的是未缩小的javascript和CSS文件.但是,当生产战争建立时,它们必须缩小(使用yuicompressor).所以,我想用缩小的文件替换原始的javascript和CSS文件.项目结构如下(没什么特别的):

+ webapp
|-- js
|-- css
...
Run Code Online (Sandbox Code Playgroud)

我想要做的是:在Gradle创建WAR之前,我想用yuicompressor缩小上面提到的文件,并希望它们被打包在WAR中.

到目前为止我所做的是在创建WAR之前运行一个任务,这会缩小文件:

war {
   it.dependsOn minifyJavaScript
}
Run Code Online (Sandbox Code Playgroud)

minifyJavaScript任务获取webapp/js文件夹中的所有文件,缩小它们并将它们存储在$ {buildDir}/js目录中.我唯一无法工作的是这些文件被打包到WAR中.我试着调整sourceSets,但是我从Gradle得到了一个错误:

apply plugin: 'java'

...
sourceSets {
    main {
        webapp {
            srcDir "${buildDir}/js"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:找不到支持的Gradle DSL方法:'sourceSets()'

我还尝试将文件包含在:

war {
   it.dependsOn minifyJavaScript
   include ${buildDir}/js
}
Run Code Online (Sandbox Code Playgroud)

此解决方案的问题是WAR仅包含缩小的文件.

那么,有没有办法告诉Gradle在WAR创建过程中添加$ {buildDir}/js路径?或者是否有更好/更简单的方法来包含缩小的文件?

javascript build-process war gradle

4
推荐指数
1
解决办法
1900
查看次数

如何使用弹簧状态机在状态转换期间抛出异常

我试图理解,在状态转换期间操作引发的异常是如何可能的。我配置了这个简单的状态机:

transitions
    .withExternal()
    .source(State.A1)
    .target(State.A2)
    .event(Event.E1)
    .action(executeAnActionThrowingAnException())
Run Code Online (Sandbox Code Playgroud)

在我的服务类中,我注入了我的状态机并发送了这个事件 E1:

@Service
public class MyService() {

    @Autowired
    private StateMachine<State, Event> stateMachine;

    public void executeMyLogic() {
        stateMachine.start()
        stateMachine.sendEvent(Event.E1);
        // how to get thrown exception here
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的服务中,我只想知道我的状态机是否以及为什么无法到达 State.A2。因为抛出的异常是由 Spring 状态机获取的,所以我在发送事件后无法得到任何响应。但是状态机没有任何错误,这意味着

stateMachine.hasStateMachineError()
Run Code Online (Sandbox Code Playgroud)

将返回假。那么,我怎样才能在我的服务中获取信息,出现问题,更重要的是什么?

我很感激你的帮助。

此致

java spring spring-statemachine

4
推荐指数
1
解决办法
1807
查看次数