Веб-сервис REST HelloWorld Jersey на Tomcat в режиме -security - PullRequest
0 голосов
/ 21 марта 2020

Я следовал основному учебнику c HelloWorld , чтобы получить пример веб-службы REST, работающей под управлением Tomcat с использованием Jersey. Все работает абсолютно нормально, и я получаю ожидаемый результат.

Однако мой хост Tomcat настаивает на том, чтобы мы тестировали наши приложения локально, используя режим -security. Когда я делаю это, приложение больше не работает. Сначала мне пришлось бороться с несколькими проблемами, связанными с разрешениями, но теперь они, похоже, решены, и это последняя ошибка. Он выводит меня на страницу с ошибкой 500, и это вершина трассировки стека:

22-Mar-2020 17:33:42.842 INFO [http-nio-8080-exec-1] com.sun.jersey.api.core.PackagesResourceConfig.init Scanning for root resource and provider classes in the packages:
  rc.framedata
22-Mar-2020 17:33:42.845 INFO [http-nio-8080-exec-1] com.sun.jersey.api.core.ScanningResourceConfig.logClasses Root resource classes found:
  class rc.framedata.HelloService
22-Mar-2020 17:33:42.845 INFO [http-nio-8080-exec-1] com.sun.jersey.api.core.ScanningResourceConfig.init No provider classes found.
22-Mar-2020 17:33:42.848 INFO [http-nio-8080-exec-1] com.sun.jersey.server.impl.application.WebApplicationImpl._initiate Initiating Jersey application, version 'Jersey: 1.19 02/11/2015 03:25 AM'
22-Mar-2020 17:33:43.094 SEVERE [http-nio-8080-exec-1] com.sun.jersey.spi.container.ContainerResponse.write A message body writer for Java class java.lang.String, and Java type class java.lang.String, and MIME media type application/json was not found.
The registered message body writers compatible with the MIME media type are:
*/* ->
  com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider
  com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter
  com.sun.jersey.server.impl.template.ViewableMessageBodyWriter

22-Mar-2020 17:33:43.095 SEVERE [http-nio-8080-exec-1] com.sun.jersey.spi.container.ContainerResponse.logException Mapped exception to response: 500 (Internal Server Error)
        javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.lang.String, and Java type class java.lang.String, and MIME media type application/json was not found.

                at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:284)
                at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1510)
                at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)
                at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)
                at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)
                at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558)
                at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:733)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.lang.reflect.Method.invoke(Method.java:498)
                at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:282)
                at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:279)
                at java.security.AccessController.doPrivileged(Native Method)
                at javax.security.auth.Subject.doAsPrivileged(Subject.java:549)
                at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:314)                at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:170)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:225)
                at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:47)
                at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:149)
                at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:145)
                at java.security.AccessController.doPrivileged(Native Method)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
                at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.lang.reflect.Method.invoke(Method.java:498)
                at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:282)
                at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:279)
                at java.security.AccessController.doPrivileged(Native Method)
                at javax.security.auth.Subject.doAsPrivileged(Subject.java:549)
                at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:314)                at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:253)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:191)
                at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:47)
                at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:149)
                at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:145)
                at java.security.AccessController.doPrivileged(Native Method)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
                at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
                at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
                at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
                at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
                at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
                at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
                at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
                at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
                at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:609)
                at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
                at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623)
                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
                at java.lang.Thread.run(Thread.java:748)
        Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class java.lang.String, and Java type class java.lang.String, and MIME media type application/json was not found.

                ... 58 more

Работает нормально без -security, поэтому я вполне уверен, что мои pom.xml зависимости и c должны быть настроены правильно, но они выглядят так:

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-server</artifactId>
      <version>1.19</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-servlet</artifactId>
      <version>1.19</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>servlet-api</artifactId>
      <version>6.0.53</version>
    </dependency>
  </dependencies>

Мой web.xml выглядит так:

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>rc.framedata</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>
</web-app>

И, наконец, мой класс HelloService.java выглядит так:

package rc.framedata;


import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/hello")
public class HelloService {

    @GET
    @Path("{clientName}")
    @Produces(MediaType.TEXT_PLAIN)
    public Response greetClient(@PathParam("clientName") String name){
        String output = "Hi " + name;
        return Response.status(200).entity(output).build();
    }

}

Я в недоумении, как отладить это или выяснить, что может быть не так. Если я угадаю ошибку, я найду только людей, которые не могут заставить свой проект работать полностью, но я могу ... он просто не работает в режиме -security.

Я полный новичок с Tomcat и Джерси, поэтому любая помощь будет высоко оценена заранее. (используя Java 1.8.0_231 и Tomcat 8.5.51 на Windows 10)

...