2016-04-18 3 views
0

У меня есть модуль в проекте OSGi.странное поведение переопределенного метода. У меня ошибка ann

payment 
    - payment-api 
    - payment-impl 

в payment-api У меня есть интерфейс UserService

public interface UserService{ 
    String method1(String p1, int p2); 
    String method2(String p1); 
} 

И реализация

public class UserServiceImpl implements UserService{ 

@Override 
public String method1(String p1, int p2){ 
    //code 
    returnt result; 
    } 

@Override 
public String method2(String p1){ 
    //code 
    returnt result; 
    } 
} 

И мой модуль payment-impl о зависимостях

<dependency> 
     <groupId>mydomain</groupId> 
     <artifactId>payment-api</artifactId> 
     <version>1.0.0</version> 
    </dependency> 

Он отлично работает. Но теперь, если я пытался добавить новую mrthod в UserService и после того, как переопределить этот метод в UserServiceImpl У меня есть ошибка:

public interface UserService{ 
     String method1(String p1, int p2); 
     String method2(String p1); 
     String test(int a); 
    } 

и

@Override 
    public String test(int a) { 
     return "sdfsdff"; 
    } 

java:[94,9] method does not override or implement a method from a supertype 

Но если удалить @Override аннотацию все отлично работает. Я не понимаю, почему? как это может быть?

interface Y{ 
    String method(); 
    } 

public class X implemets Y{ 
    @Override 
    String method(){ 
    return "some string"; 
    }//is error 

//------ 


String method(){ 
    return "some string"; 
    }//is fine 

} 

И если я не реализую этот метод, компилятор метода ругается. И по умолчанию IDE переопределяет methosd с аннотацией. И еще один метод, который уже реализован, отлично работает без аннотаций

+0

Это псевдокод, и, хотя это нормально для SO, пожалуйста, убедитесь, что пример работает с точки зрения воссоздания вашего кода. Код ошибки * очень специфичен * - Вы пытались изменить свой шаблон, чтобы ответить на ошибку? – wahwahwah

+2

Просто угадывая здесь, модуль impl все еще может ссылаться на устаревшую версию модуля api. Если этот узел указывает Maven, вы можете переименовать свою версию 1.0.0-SNAPSHOT, очистить кэш .m2, а затем очистить и перестроить продукт. – Roman

+0

Да, я попробовал. конечный вопрос псевдокода. первый код реального проекта, изменились только имена методов. – user5620472

ответ

1

Модуль impl может ссылаться на устаревшую версию модуля api. Возможно, вы захотите переименовать свою версию 1.0.0-SNAPSHOT, очистите локальный репозиторий maven (обычно в ~/.m2/repository), а затем очистите и перестройте продукт.

Я не уверен, важно ли здесь суффикс версии с SNAPSHOT, но это не так уж плохо, если продукт находится в разработке.

Я также не уверен, почему вы, возможно, удалили устаревшую версию модуля. Чтобы действительно углубиться в проблему, я бы порекомендовал:

  1. Осмотрите путь к классу, который вы используете для запуска приложения, чтобы определить/подтвердить местоположение, в котором используется api jar.
  2. Поймите, какая последовательность событий гарантирует, что эта банка будет обновлена ​​с помощью вашего последнего встроенного кода. Возможно, вам всегда нужно вызывать mvn install и не может просто полагаться на процесс компиляции IDE, что я не уверен.
Смежные вопросы