0

サービスとdaoレイヤーを備えたSpring(3.1)アプリケーションがあります。このスプリングレイヤーでrequestfactory(gwt 2.4)を使用しようとしています。

ここに私のクラスのいくつか

私のドメインクラス

public class Account {
  Long id;
  String username;
  // get, set
}

春とgwtの間の架け橋

public class SpringServiceLocator implements ServiceLocator {

    @Override
    public Object getInstance(Class<?> clazz) {
        HttpServletRequest request = RequestFactoryServlet.getThreadLocalRequest();
        ServletContext servletContext = request.getSession().getServletContext();
        ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        return context.getBean(clazz);
    }
}

私のアカウントプロキシ

@ProxyFor(value=Account.class, locator = AccountLocator.class)
public interface AccountProxy extends EntityProxy{
    public Long getId();
    public String getUsername();

    public void setUsername(String userName);
    public void setId(Long id);    
}

RequestContextクラス

@Service(locator = SpringServiceLocator.class, value =AccountService.class)
public interface AccountRequest extends RequestContext {
    Request<List<AccountProxy>> loadAllAccounts();
}

私のrequestFactoryクラス

public interface AccountRequestFactory extends RequestFactory {
    AccountRequest accountRequest();
}

私の春の奉仕

public interface AccountService {
    public List<Account> loadAllAccounts();
}

@Service
public class AccountServiceImpl implements AccountService{
    @Autowired
    private AccountDAO accountDAO;
}

エンティティにメソッドを配置しないようにするアカウントロケーター

public class AccountLocator extends Locator<Account, Long> {

    @Autowired
    private AccountDAO accountDAO;

    @Override
    public Account create(Class<? extends Account> clazz) {
       return new Account();

    }
}

applicationContext.xml

<context:annotation-config />
<context:component-scan base-package="com.calibra" />
<bean id="accountService" class="org.calibra.server.service.AccountServiceImpl"/>
<bean id="accountDAO" class="org.calibra.server.dao.AccountDAOImpl"/>

デモは機能しますが、このエラーが発生します:

com.google.web.bindery.requestfactory.server.UnexpectedException:キータイプの単一のパラメーターを持つ静的メソッドが見つかりませんでした

また、私のAccountProxyで、この苦情が表示されます(警告)

ドメインタイプorg.calibra.domain.Accountには、Account findAccount(java.lang.Long)メソッドがありません。AccountProxyをサーバーに送信しようとすると、サーバーエラーが発生します。

ドメインクラスに検索方法を追加したくありません。この方法を春のサービスに入れようとしましたが、同じ警告が表示されます。

正常に動作するロケーターで編集

奇妙なことに、私はBeanをapplicationContext、context:annotation、context:component-scanに入れる必要がありますが役に立たないようです

何か案が?

4

1 に答える 1

2

ドメイン タイプ org.calibra.domain.Account には、アカウントの findAccount(java.lang.Long) メソッドがありません。

ある種の find メソッドを提供しない場合、RequestFactory はサーバーに到達したときにオブジェクトを再構成する方法がありません。新しいオブジェクトしか作成できないため、既存のデータとのマージが妨げられます。これを取り除くと、RPC が再び発生する可能性があります。

静的メソッドが必要ない場合は、Locatorオブジェクトを検索できるインスタンスを提供してください。https://developers.google.com/web-toolkit/doc/latest/DevGuideRequestFactory#locatorsから:

エンティティ自体に永続化コードを実装したくない場合はどうすればよいでしょうか? 必要なエンティティ ロケータ メソッドを実装するには、Locator を拡張するエンティティ ロケータ クラスを作成します。

public class EmployeeLocator extends Locator<Employee, Long> {
  @Override
  public Employee create(Class<? extends Employee> clazz)
  {
    return new Employee();
  }
  ...
}

次に、 @ProxyFor アノテーションでエンティティに関連付けます。

@ProxyFor(value = Employee.class, locator = EmployeeLocator.class)
public interface EmployeeProxy extends EntityProxy {
  ...
}

createだけでなく、すべてのメソッドを実装する必要があります-そして、あなたが興味を持っている主なものはfind(Class, Long). すべてのプロキシに1 つのタイプを使用できる可能性がありLocatorます - 2.4.0 および 2.5.0-rc1 の時点では、実装に失敗しても安全ですgetDomainType()。引数。

JPA と Guice でこれがどのように見えるかの例を次に示しますが、Spring と使用している永続化メカニズムで実装できるという考えは十分に明確だと思います。ここでは、すべてのエンティティが HasVersionAndId を実装することが期待されており、ロケーターが getVersion と getId を呼び出す方法を一般化できるようになっています。永続化されたすべてのエンティティに対して独自の基本クラスを使用することもできます。

( https://github.com/niloc132/tvguide-sample-parent/blob/master/tvguide-client/src/main/java/com/acme/gwt/server/InjectingLocator.javaから)

public class InjectingLocator<T extends HasVersionAndId> extends Locator<T, Long> {
  @Inject
  Provider<EntityManager> data;

  @Inject
  Injector injector;

  @Override
  public T create(Class<? extends T> clazz) {
    return injector.getInstance(clazz);
  }

  @Override
  public T find(Class<? extends T> clazz, Long id) {
    return data.get().find(clazz, id);
  }

  @Override
  public Class<T> getDomainType() {
    throw new UnsupportedOperationException();//unused
  }

  @Override
  public Long getId(T domainObject) {
    return domainObject.getId();
  }

  @Override
  public Class<Long> getIdType() {
    return Long.class;
  }

  @Override
  public Object getVersion(T domainObject) {
    return domainObject.getVersion();
  }
}
于 2012-08-19T21:43:08.630 に答える