2014-02-27 1 views
0

은 내가 작업에 대한 몇 가지 클래스 계층 구조를 가지고 :다형성 봄 자바 서비스 및 컨트롤러 내 프로젝트에서

@RequestMapping(value = "/executeTask", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
@ResponseStatus(value = HttpStatus.OK) 
public void executeTask(@RequestBody BaseTaskDTO baseTaskDTO , HttpServletRequest request) { 

    this.taskService.execute(baseTaskDTO); 

} 

이 서비스는 실제로 해당 서비스와 "실행"메소드를 호출하고 싶습니다. 네딩 작업.

너무 좋지 않습니다. 작동하지 않습니다.

이 목표에서 다형성이 도움이 될 수 있습니다. 즉, 모든 tasksDTO가 "execute"메소드를 구현 한 다음 간단히 baseTask.execute()를 호출합니다. 이 문제는 DTO 안에 일부 로직을 넣는 것이 정말 어색하다고 느낍니다 (데이터 만 존재하고 다른 것은 없어야 함)

문제를 해결하기위한 좋은 방법이 있습니까? 당신은 TaskExecutor에 대해 생각할 수있는

답변

0

, 그것은 당신의 작업과 TaskService의 필드되며 주어진 작업을 수행 할 수있는 권리 TaskExecutor를 가져 오는 데 사용됩니다 Map<Class<?>,TaskExecutor>을 실행할 책임이 있습니다. 이 당신이 관련된 주어진 TaskExecutor와 그지도에 선언 실행하려는 모든 DTO 클래스를해야한다는 점을 암시

@Override 
public void execute(TaskDTO task) { 
    taskExecutors.get(task.getClass()).execute(task); 
} 

: 서비스에서

당신처럼 (다른 방법들) 뭔가를 할 수있다.

컨트롤러는이를 올바른 DTO 개체로 구문 분석하고 실행을 수행하는 데 가장 좋은 TaskExecutor을 정의하는 TaskService을 제공합니다. execute 메소드가 호출되어 해당 DTO를 매개 변수로 호출합니다. 하나는 특정 TaskDTO 구현을 처리하는 것, TaskService하지만 TaskExecutor의 다른 구현 방법을 실행해야합니다 말

public interface TaskExecutor { 

    void execute(TaskDTO taskDTO); 

} 

: 뭔가처럼 한 가지 가능한 TaskExecutor 정의는 것입니다. 이것은 몇 가지 개념을 사용합니다. Strategy Design Pattern

이것은 실행 방법을 DTO 자체에서 디코드해야하는 요구 사항을 해결합니다.

0

다이내믹 다형성은 매개 변수가 아니라 메소드 호출 용이므로 실제로 컴파일되지 않습니다. 여기에서는 존재하지 않는 오버로드 된 메서드를 호출합니다. 간단한 "해킹"은 다음과 같습니다.

@Transactional 
@Service 
public class TaskService implements ITaskService { 

    public void execute(BaseTask task){ 
     if(task instanceof CriticalTask){ 
     execute((CriticalTask) task); 
     else 
     execute((MarginalTask) task); 
    } 

    void execute(CriticalTask task) { 
     ... 
    } 

    void execute(MarginalTask task) { 
     ... 
    } 
} 
+0

instanceof는 내가 피하려고하는 것입니다. – Urbanleg

0

거꾸로하고있는 것처럼 느낍니다. Task은 그것이하는 일과 그것이하는 일을 알아야합니다. Runnable과 같은 run 또는 execute 메소드가 있어야합니다.귀하의 TaskService는 만 다형성이 활동하기 시작하는 곳이다 주어진 인수

public void execute(BaseTask task) { // <-- doesn't matter what implementation it is 
    task.execute(); 
} 

에서 해당 메소드를 호출 할 필요가있다.

+0

내 문제는 작업이 엔티티라는 것입니다. 그리고 비즈니스 로직을 엔티티 안에 넣고 싶지는 않습니다. (관련 엔티티는 필드와 설정자 \ getters에 관한 것입니다 - pojo) 동의하지 않습니까? – Urbanleg

+0

@Urbanleg 예, 아니요. 이 경우 실행될 수있는 무언가를 생성하는 팩터 리 (다른 답변과 같음)가 필요할 것입니다. –