【问题标题】:Wildfly 10 : ear, ejbs and restful-servicesWildfly 10:ear、ejbs 和 restful-services
【发布时间】:2020-03-22 11:13:20
【问题描述】:

在转换我的 RESTful 服务的依赖项时遇到了麻烦。 在使用此构造转移我的宁静服务的依赖关系之后。 以下是我的网络模块的一部分。

web.xml

   <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>se.nrm.bio.mediaserver.rs</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

Java 类

@Path("/upload")
public class Service {

    private final static Logger logger = Logger.getLogger(Service.class);

    @EJB
    private ServiceBean bean;

    public Service() {
    }

    @GET
    @Path("/isOK")
    public Response isOK() {
        logger.info("@GET /isOK");
        logger.info("ServiceBean is "+bean);
        return Response.status(200).entity("service ok").build();
    }

   @POST
   @Path("/other")
   @Consumes(MediaType.MULTIPART_FORM_DATA)
   public Response uploadAllFiles(
        @FormDataParam("fileName") String fileName,
        @FormDataParam("owner") String owner,
        @FormDataParam("content") final InputStream inStream) {

当我在自己的项目中运行它并部署它时,Web 服务可以工作。 当我将 Web 服务链接到我的“maven-multi-module”项目并替换当前的 Web 模块时,不会注入 EJB(在 ~/isOK 的记录器中获取“null”服务)

仔细查看 ear-file 和 wildfly-admin 界面。 我可以看到 ear-file 的结构在那里并且看起来正确,wildfly-admin 显示了我的 bean。 我是不是靠这里的org.glassfish.jersey 依赖关系搞砸了 我正在访问服务 ~/isOK 但是当我调用 ~/other 时,我得到以下堆栈跟踪。这是一个死胡同吗,当涉及到获取 bean 时,我是否必须使用另一种方法来解决问题? (我在那个 bean 中有我的数据库连接)

(注意:我发现了多个 restful-clients 示例和一些 restful-services [MediaType.MULTIPART_FORM_DATA] - 但我无法找到一个示例服务和一个示例客户端,它们都是用 Java 和我真的需要那个....因为我正在从另一个 java 应用程序调用服务。现在找到的所有书籍似乎都很旧。)

ERROR [io.undertow.request] (default task-13) UT005023: Exception handling request to /MediaServerResteasy/rest/upload/other: javax.servlet.ServletException: java.lang.NullPointerException
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:423)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)

我的多 Maven 结构似乎可以工作,所以这是我现在面临的挑战。 我希望这个示例对您来说似乎很有趣,我希望你们中的一些人遇到了同样的问题并解决了这个问题 - 上传具有某些属性的文件。

最好的,我

【问题讨论】:

    标签: rest maven jersey wildfly wildfly-10


    【解决方案1】:

    这里有几件事。首先,如果您使用 Wildfly,您可以为标准的 JAX-RS 环境编写代码——您不需要直接涉及 Jersey 的任何内容。更改您的 pom.xml 以删除您显示的所有依赖项并使其仅依赖于:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    

    因为 Wildfly 10 主要是兼容 EE 7 的环境。考虑尽快升级到更新的 Wildfly,因为 Wildfly 10 已经很老了。

    现在,从您的 web.xml 中删除与泽西岛相关的所有内容。这可能意味着web.xml 基本上是空的。这很好,除了您可能希望保留它以指示您正在使用的 servlet 规范。我用:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
    </web-app>
    

    这将是 EE 7 版本。请注意,它基本上是空的。要指定 Web 服务的根路径,您需要一个类:

    @ApplicationPath("/rest")
    public class RestApplicationConfig extends Application {
        // intentionally empty
    }
    

    源代码中的任何位置。这又是标准的 JAX-RS。

    您可以使用@EJB 注释,但我倾向于使用更现代的@Inject。它们基本相同,但@Inject 可以带来更多的东西,而不仅仅是 EJB。

    我会从那里开始,确保一切按照您的预期进行。如果您仍然对MULTIPART_FORM_DATA 有疑问,那么我将创建一个包含两面代码的新帖子。

    【讨论】:

      猜你喜欢
      • 2018-08-14
      • 2017-03-25
      • 2021-04-02
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多