0

我正在尝试使用 Java EE MVC API 实现 - Ozark 创建一个 MVC 应用程序。我使用 Grizzly 作为嵌入式 Web 服务器。当然,使用 Ozark 是一个 JAX-RS 实现 - Jersey。

这是我的服务器类,其中运行方法由 main 方法调用:

public class GrizzlyServer {    
    private static final Logger LOGGER = LoggerFactory.getLogger(GrizzlyServer.class);
    private static final String APP_NAME = "Hello World";
    private static URI baseUri;
    private static final String PROTOCOL = "http://";
    private static final String HOST = "localhost";
    private static final String PATH = "app/";
    private static final int DEFAULT_PORT = 8080;

    private GrizzlyServer() {

    }

    private static int port(String[] args) {
        if (args.length > 0) {
            String port = args[0];          
            try {
                return Integer.valueOf(port);
            } catch (NumberFormatException exception) {
                LOGGER.error("Invalid port number {}", port);
                LOGGER.error("Default port number {} will be used", DEFAULT_PORT);
            }
        }

        return DEFAULT_PORT;
    }

    public static HttpServer startServer(int port) {
        final ResourceConfig rc = new ApplicationResourceConfig();
        baseUri = UriBuilder.fromUri(PROTOCOL + HOST).port(port).path(PATH).build();
        HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(baseUri, rc);

        return httpServer;
    }


    public static void run(String[] args) throws IOException {
        int port = port(args);
        try {
            final HttpServer server = startServer(port);
            LOGGER.info("{} started with WADL available at {}application.wadl", APP_NAME, baseUri);
            LOGGER.info("Hit Enter to stop it...");
            System.in.read();
            server.shutdown();
        } catch (IOException exception) {
            LOGGER.error("{}", exception.getMessage());
            LOGGER.error("Exit...");
            System.exit(1);
        }
    }
}

这是我的控制器:

@Controller
@Path("hello-world")
public class HelloWorldController {

    @GET
    public String index() {
        return "/WEB-INF/index.jsp";
    }
}

我的应用程序结构如下所示:

java
resources
web
..WEB-INF
  ..index.jsp

如果我运行我的应用程序并打开我的浏览器http://localhost:8080/app/hello-world,它会显示返回字符串 od my method index 而不是index.jsp的内容:

/WEB-INF/index.jsp

这些是相关的依赖项(泽西版本:2.26):

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-grizzly2-http</artifactId>
</dependency>
<!-- Dependency Injection -->
<dependency>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>hk2-api</artifactId>
    <version>2.5.0-b50</version>
    <exclusions>
        <exclusion>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
</dependency>
<!-- MVC -->
<dependency>
    <groupId>org.glassfish.ozark</groupId>
    <artifactId>ozark</artifactId>
    <version>1.0.0-m02</version>
</dependency>

任何帮助将不胜感激。谢谢...

4

2 回答 2

0

如果没有看到完整的项目,很难判断您的设置有什么问题。但是,有几点我想说明:

首先,您应该更新到最新版本的规范和 RI。最新版本包括一个用于 Jersey 支持的特殊模块。所以你应该使用这些依赖项:

<dependency>
    <groupId>javax.mvc</groupId>
    <artifactId>javax.mvc-api</artifactId>
    <version>1.0-pr</version>
</dependency>
<dependency>
    <groupId>org.mvc-spec.ozark</groupId>
    <artifactId>ozark-jersey</artifactId>
    <version>1.0.0-m03</version>
</dependency>

第二件事:MVC中有一个特殊的文件夹用于存储视图,所以你应该把JSP文件放在WEB-INF/views/. 如果您的视图的完整路径是/WEB-INF/views/index.jsp,您只需index.jsp从控制器方法返回,因为视图名称是相对于视图文件夹的。

您的控制器仅呈现视图名称而不是视图内容的事实通常意味着所需的 JAX-RS 提供程序未正确注册。因此,您可能必须手动注册它。不确定这是否是由于您使用的是嵌入式 Grizzly 造成的。因此,您可能必须添加OzarkFeature.classApplication#getClasses().

我希望这有帮助。如果您有任何其他问题,请随时加入ozark-users邮件列表。

于 2018-02-21T08:47:18.283 回答
0

您应该定义一个使用@ApplicationPath 注册 jax-rs 应用程序的类。

于 2018-09-17T13:09:53.220 回答