Не удается найти URL-адреса для служб REST в Java

#java #rest #servlets

#java #rest #сервлеты

Вопрос:

Есть много сообщений, касающихся создания служб REST, и я прочитал десятки из них; Я все еще не могу связаться со своей службой. Моя служба создает (через PUT или POST) и возвращает (через GET) Offerror’ы, которые имеют идентификатор, имя и адрес. Предложение — это класс, Offerrors — класс, содержащий экземпляры Offerror в ConcurrentMap, а OfferrorServlet — это класс servlet. Пожалуйста, помогите мне исправить мое кодирование REST; Я бы предпочел аннотировать классы, чем настраивать web.xml .

Для запуска я развертываю артефакт OfferorWebService-0.0.1-SNAPSHOT.war в JBoss. Я тестирую через PostMan, с набором приложений типа Accept amp; Content / json и аутентификацией с учетной записью администратора

ПОЛУЧИТЬ http://localhost:8080/OfferorWebService-0.0.1-SNAPSHOT/offerrors () выдает «404 не найдено»

СООБЩЕНИЕ http://localhost:8080/OfferorWebService-0.0.1-SNAPSHOT/offerrors выдает «Метод 405 не разрешен»

Что мне нужно добавить / изменить в моем сервлете или вызовах? Нужны ли мне дополнительные файлы конфигурации? Спасибо!

в pom.xml

     <repositories>
        <repository>
            <id>jboss-public-repository-group</id>
            <name>JBoss Public Repository Group</name>
            <url>http://repository.jboss.org/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
        </repository>
    </repositories>
  <build>
    <sourceDirectory>src.main.java</sourceDirectory>
    <plugins>
       <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
             <version>3.6.1</version>
             <configuration>
                 <source>1.8</source>
                 <target>1.8</target>
             </configuration>
         </plugin>      
    </plugins>
  </build>
  <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1.1</version>
        </dependency>
 </dependencies>
  

OfferrorServlet.java (Я удалил код, который был закомментирован для краткости)

 @WebServlet("/Offerrors")
public class OfferorServlet extends HttpServlet {
    
       static final long serialVersionUID = 1L;
       static final ObjectMapper om = new ObjectMapper();
       Offerors mapOfOfferors; 
       
        @Override
        public void init() {
            mapOfOfferors = new Offerors();
            mapOfOfferors.setServletContext(this.getServletContext());
        }

        // GET /offeror or /offeror?id=123
        @Override
        @GET  
        public void doGet(HttpServletRequest request, HttpServletResponse response) {
            String param = request.getParameter("id");
            Integer key = (param == null) ? null : Integer.valueOf((param.trim()));
     
            // return an Offeror
            try {
                    sendResponse(response, om.writeValueAsString(mapOfOfferors.getOfferror(key)));                  

            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }

        @POST  // /offerors
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response) {
            String name = request.getParameter("name");
            String address = request.getParameter("address");
            String msg = "Creating an offeror";
            if (name == null || address == null)
                throw new RuntimeException(Integer.toString(HttpServletResponse.SC_BAD_REQUEST));

            Offeror offeror = new Offeror();
            // Save the ID of the newly created Offeror.
            offeror.setName(name);
            offeror.setAddress(address);
            int id = mapOfOfferors.addOfferor(offeror);

            try {
                sendResponse(response, om.writeValueAsString(msg));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }

        // Longer PUT method removed for brevity

        // Methods Not Allowed
        @Override
        public void doTrace(HttpServletRequest request, HttpServletResponse response) {
            throw new RuntimeException(Integer.toString(HttpServletResponse.SC_METHOD_NOT_ALLOWED));
        }

... (many more of the same)
}
  

Ответ №1:

Прежде всего, я думаю, вы не должны использовать эти аннотации в сочетании с сервлетами, они не предназначены для этого, и я думаю, что это не будет работать должным образом, doGet, doPut, doTrace, doPost хорошо справятся с работой, если вы хотите использовать библиотеки Java, ориентированные на службы rest с большим количеством функций, вам следует изучить документы jaxRS или jaxWS, howTo, сервлеты больше ориентированы на базовые http-итерации и с jsp и этой моделью, но, конечно, вы можете обойтись обычными сервлетами, просто удалите эти аннотации и дают обратную связь о том, что произошло.

Комментарии:

1. Спасибо. Я заставил это работать, я опубликую об этом позже