2016-04-12 10 views
0

ファサードオブジェクトserviceで表されるモデルとJSPベースのビューで構成される小さなSpringアプリケーションを作成しています。その間に、通常のSpringコントローラと、文字列IDをモデルからオブジェクトに変換するコンバータがあります。Springコンバーターの自動オブジェクトにアクセスできない

このコンバータでは、サービスオブジェクト(@Autowired)を使用して、serviceから正しいモデルオブジェクトを検索します。問題は、コンバーターがserviceのメソッドにアクセスするたびに何も起きないことです。エラーや例外はなく、そのまま継続してnullを返します。

serviceが正しく初期化されているかどうかを確認していますが、それは問題ではないようです。デバッグ中に私はプログラムがThreadPoolExecutorを通過し、serviceでメソッドを実行しようとするたびにそこに停止することに気づいた。これは、問題がロックされている間にserviceにアクセスすることに関連していると仮定します。

私はすでに同期ブロックに必要なコードを配置しようとしましたが、それは役に立ちません。 Springコンバーターの@Autowiredオブジェクトのメソッドにアクセスできない理由を教えてもらえますか?ここで

は、それは価値がある何のためのコンバータクラスです:

public class IdToPublisherConverter implements Converter<String, Publisher>{ 

    @Autowired 
    private MainService service; 

    @Override 
    public Publisher convert(String id) { 
     return service.getPublisher(Long.getLong(id)); 
    } 
} 

EDIT:

MainServiceを取得するためのインタフェースを提供ファサードオブジェクトで、追加、更新、および私のモデルデータを削除する(GameオブジェクトPublisherオブジェクト)

service.getPublisher(id)は、serviceからPublisherオブジェクトを取得します。これは、コンバーターがJSPページから受信したlong型のIDに基づいています。この方法は、MainServiceで、次の方法に行く:

@Override 
public Publisher getPublisher(long id) { 
    Publisher publisher = repository.readPublisher(id); 
    return publisher; 
} 

に行くどの:あなたのサービスが

@Service("mainService") 
public class MainService... 

とその中に例えば@Service注釈を、持っている場合

private final Map<Long, Publisher> publishers; 

... 

@Override 
public Publisher readPublisher(long id) { 
    return publishers.get(id); 
} 
+1

「MainService」とは何ですか? 'getPublisher'は何をしますか? [MCVE]を入力してください。 – Savior

+1

あなたはすでに 'service'が初期化されているので(autowiringが働いている)、' service'で参照されるオブジェクトがロックされていることを確認しました。だから、なぜロックされたのかを伝えるために 'service.getPublisher(...)'が何をしているのか(コードではなくコード)を参照する必要があります。 – Thomas

+0

あなたのリポジトリの '空ではない? – home

答えて

-1

チェック、トランザクションメソッドがある場合は、@ Transactionalを忘れないでください。

コードが少ないそれが複雑であることが示されていますが、そうであればあなたに役立つと思います。

+0

'@ Service'と' @ Transactional'アノテーションが何をしているのか分かりませんが、私はバックエンドでSpring固有のものを使いたくありません。私の視点と私のモデルとの間の疎結合を維持することは、私の最優先事項です。 – Exevan

+1

@Exevanビューとモデルの間に柔軟性が必要な場合、これらのアノテーションはうまくいくと思います。多くの層を持つことは重要です。サービスアノテーションを持つクラスは、ビューとモデルに実質的に依存しません。必要なサービスだけを呼び出す必要があります。たとえば、さらにいくつかの集計を行いたい場合は、Delegateクラスをコンポーネント(注釈)として組み込み、サービスを呼び出して...モデルとビューあなたが変更が必要な場合、より柔軟になるだろう –

0

だから、1時間の手抜きをした後、私はついに自分の問題を見つけ出し解決しました。 この問題はマルチスレッドとは関係なく、StringからLongへの変換に関連していました。代わりにLong.getLong(id)を使用して、私はこのようなものを使用している必要があります。

@Override 
public Publisher convert(String idString) { 
    return service.getPublisher(Long.parseLong(idString)); 
} 
0

をあなたのコンバータに@Component注釈を追加してみてください。コンバーターがSpringConfigurationに登録されていることを確認してください

@Configuration 
@EnableWebMvc 
@ComponentScan 
public class ServerConfig extends WebMvcAutoConfigurationAdapter { 
    @Override 
    public void addFormatters(FormatterRegistry formatterRegistry) { 
     converterAutoscanner(formatterRegistry); 
     super.addFormatters(formatterRegistry); 
    } 

    @SuppressWarnings("rawtypes") 
    private void converterAutoscanner(FormatterRegistry formatterRegistry) { 
     Reflections reflections = new Reflections("com.somepackege"); 
     Set<Class<? extends Converter>> allClasses = reflections.getSubTypesOf(Converter.class); 
     allClasses.forEach(s -> { 
      try { 
       formatterRegistry.addConverter(s.newInstance()); 
      } catch (Exception e) { 
       LOGGER.error(e); 
      } 
     }); 
    } 
} 


@Component 
public class CommentConverter implements Converter<String, Comment>{ 
    //converter code 
} 
0

IdToPublisherConverterをBeanとして定義する必要があります。このように

@Service 
public class IdToPublisherConverter... 

@Autowiredアノテーションを使用できるのは、@Autowiredアノテーションだけです。それ以外の場合はnullが返されます。 IdToPublisherConverterがBeanでない場合、ユーザーはClasspathXmlApplicationcontextを使用してSpring Beanを取得します。

関連する問題