1

抱歉,我只是从所有这些 EJB、JSF 和 JAX-RS 的东西开始,现在需要你的帮助。我创建了一个 JAX-RS Resource 类,它工作得很好并且实现了@GET、@PUT 等方法。

在同一个项目中,我现在使用相应的 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

您首先需要访问生成的 HttpServletRequest 对象的底层 servlet 容器(假设是一个,而不是 portlet 容器)。使用该FacesContext对象以下列方式访问 HttpServletRequest 对象:

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

该类HttpServletRequest提供了几种实用方法来获得原始请求的近似表示:

  • getRequestURL(),它提供了没有查询字符串的原始请求
  • getScheme, getServerName, getServerPort, getContextPath, getServletPath, getPathInfogetQueryString所有的输出可以依次组合得到原始请求。如果您想要 URL 的较小片段,您可能必须省略后面的调用。
于 2012-09-01T19:04:41.250 回答