1

申し訳ありませんが、私はこの EJB、JSF、および JAX-RS のすべてを始めたばかりで、今すぐあなたの助けが必要です。非常にうまく機能し、@GET、@PUT などを実装する JAX-RS リソース クラスを作成しました。

同じプロジェクトで、BackBean に応じた JSF ページを作成しました。この Backbean は REST インターフェイスと通信する必要があります。テスト中に、REST インターフェースの URI を Bean にハードコーディングしましたが、もちろんプログラムで URI を取得したいと考えています。@Produces メソッドとインジェクションを試してみましたが、常に IllegalStateException が発生します。これは文脈に関係していると思いますが、実際にはそれを解決するための理解がありません。

私のRESTリソース:

@Path("task")
@ManagedBean
@RequestScoped
public class TaskResource {

@Context
private UriInfo context;

@Inject TaskLifecycle lc;

public TaskResource() {
}

@GET
@Path("{id}")
public Response getTask(@PathParam("id") String id)  { ... etc.

私のバックビーン:

@ApplicationScoped
@LocalBean
@Named("tmmlWrapper")
public class TmmlTaskWrapperBean implements Serializable {

// Here another ManagedBean is injected, which works fine!
@Inject TaskLifecycle       lc;

そして最後に私のJSFページ:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org
/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Tasklist</title>
</h:head>
<h:body>
    <h:form>
        <h:outputLabel ><h3>Tasklist:</h3></h:outputLabel>

        <h:dataTable value="#{tmmlWrapper.taskList}" var="tl">

        <h:column>

            <f:facet name="header">ID</f:facet>
            #{tl.id}

        </h:column> ... and so on ... etc.

私の質問: BackBean はどうすれば REST リソースの URI を取得できますか (例: "http://exampledomain:8080/as")? どんな助けでも大歓迎です!

乾杯、ジョーン

4

1 に答える 1

3

最初に、基盤となるサーブレット コンテナー (ポートレット コンテナーではなく 1 つを想定) で生成された HttpServletRequest オブジェクトへのアクセスを取得する必要があります。オブジェクトを使用FacesContextして、次の方法で HttpServletRequest オブジェクトにアクセスします。

HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getExternalContext().getRequest();

このHttpServletRequestクラスは、元のリクエストに近い表現を取得するためのいくつかのユーティリティ メソッドを提供します。

  • getRequestURL()、元のリクエスト sans クエリ文字列を提供します
  • getSchemegetServerNamegetServerPortgetContextPath、およびすべての出力を順番に組み合わせて、元の要求を取得できますgetServletPath。URL の断片を少なくしたい場合は、後者の呼び出しを省略しなければならない場合があります。getPathInfogetQueryString
于 2012-09-01T19:04:41.250 に答える