3

私は最初のSeam+Androidアプリケーションを開発しており、予想どおりにいくつかの新しいシナリオに直面しています。

特にこのアプリでは、RESTサービスでのサーバー呼び出しの80%から90%が単純な同期を行うためのものであり、クライアントがしばらくの間使用されなくなったため、状態を維持しないことにしました。 )これらの呼び出しのためにサーバー側で状態を維持する意味はありません。

デバイスからサーバー側に送信されたオブジェクトを永続化する必要がある特定のルーチンがあり、このオブジェクトは特定のユーザーにバインドされます(私の意見では非常に一般的なシナリオです)。

それで、説明するためにいくつかのコードがあります。

ホームインターフェイスには、Seamによって注入されたユーザーがいます。

@Name("pesoHome")
public class PesoHome extends EntityHome<Peso> {

    private static final long serialVersionUID = 6087763635317971234L;

    @In
    User user;

このホームインターフェイスを使用するRESTサービスが必要な場合よりも:

public class PesoRest{

    @Logger
    Log log;

    @In(create = true)
    UserPesquisa userPesquisa;

    @In(create = true)
    PesoHome pesoHome;

    @POST
    @Path("/cadastrar/{userEmail}")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response cadastraPeso(@PathParam("userEmail") String email, String jsonString)
    {
            String json = jsonString;
            System.out.println("String jSon no servidor ==>> " + json);

また、ホームインターフェイスでのユーザーインジェクションが原因で、実行時に次のエラーがトリガーされます。

Caused by: org.jboss.seam.InstantiationException: Could not instantiate Seam component: pesoHome
    at org.jboss.seam.Component.newInstance(Component.java:2144)
    ... 46 more
Caused by: org.jboss.seam.RequiredException: @In attribute requires non-null value: pesoHome.user

リクエストの本文で、JSonオブジェクトがこのユーザーに関する情報を提供し、これにより、挿入されたuserPesquisa参照を使用してこのユーザーを回復できることに注意してください。ユーザーへの参照なしでシームコンポーネントを構築し、それよりもユーザーを構築して新しい会話に配置し、必要なホーム参照を挿入するという別のアプローチをとることができることを私は知っていますが...
私は疑問に思っていましたこれは一般的なシナリオであるため、おそらくこれにはもっと標準的なアプローチがあるはずです。助言がありますか?:)

[] s

4

1 に答える 1

2

このスレッドのコメントでArthurが示唆しているように、コードを少し変更して、機能するようになりました。

PesoHome:

    @In(required=false)
    User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

そしてPesoRestよりも:

User usuario = userPesquisa.pesquisaUsuarioPorEmail(email);
pesoHome.setUser(usuario);

また、作成時にユーザーが不要になったため、エラーはトリガーされず、DBを検索した後、レイトバインドを実行して正しいユーザーを回復できます。非常に簡単な解決策。アーサーに感謝します。

[] s

于 2010-09-30T23:42:59.200 に答える