Konfiguracja Spring MVC od podstaw, błąd 404

Konfiguracja Spring MVC od podstaw, błąd 404
Lukasz_
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:140
0

Ostatnio w celach dydaktycznych chciałem sobie stworzyć od zupełnych podstaw projekt używający Springa. Zacząłem zabawę od Spring MVC, ale nie chciałem korzystać ze Spring Boot czy Spring initializr. Stworzyłem pom.xml, strukture katalogów, pliki konfiguracji (chcę konfigurować projekt w Javie, nie xmlem). Dodałem prosty kontroler. Niestety, po wygenerowaniu artefaktu i wrzuceniu go do Tomcata dostaję 404 na http://localhost:{port}/

Adres repozytorium: https://github.com/lukasz-gosiewski/springtest

Czy ktoś wie może gdzie leży problem ?

edytowany 1x, ostatnio: Lukasz_
1

Spróbuj http://localhost:{port}/{nazwa_pliku_war}/

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Masz ustawione skanowanie złego pakietu. Jak już kopiujesz kod, to ze zrozumieniem. W projekcie masz tylko pakiet config a jednak skanujesz pl.test.springtest. Ciekawe jak Spring miałby w takim wypadku znaleźć ten twój kontroler...

Poza tym jeśli chcesz to zrobić "bez boota" to ci brakuje w tym projekcie trochę... ;] To wygląda jakbyś wziął aplikacje ze Spring Boota a potem go wywalił z zależości licząc że to będzie miało ręce i nogi, a nie będzie. Maven też ci nie zbuduje ot tak poprawnego wara sam z siebie. Boot takie rzeczy dodaje od "siebie", ale jak go nie używasz to musisz to zrobić ręcznie.

Popatrz troche na https://github.com/Pharisaeus/SpringScaffoldApplication wiem że tam jednak jest trochę XMLa, ale możesz sobie z tego wystartować i zmieniać konfiguracje na javę.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 7x, ostatnio: Shalom
Lukasz_
W tym projekcie z tego co widzę cała konfiguracja jest w XML. Takie rzeczy robiłem wielokrotnie, problemem jest przejście na konfigurację Javową, ale tak, żeby nie używać boota. W większości źródeł albo jest wielka kobyła konfigurowana XMLowo, albo proste projekty wykorzystujące boota + javowy config.
Lukasz_
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:140
0

@Shalom: Nic nie kopiuje więc twoje docinki sobie daruj, a co do skanowania pakietu to po prostu wynik eksperymentów bo też pierwsze co obstawiałem to niepoprawny pakiet w skanowaniu. Nie liczę na to że coś mi samo zbuduje wara, robię to ręcznie. Ręcznie też deployuję wara na tomcata. Problem polega na tym że Spring najwyraźniej kompletnie nie widzi mojego kontrolera, co by potwierdzało błędne skanowanie pakietów.

Czego konkretnie mi brakuje w projekcie? Jest to całkiem możliwe, robię to pierwszy razw takiej formie, do tej pory zawsze używałem XMLi.

@slepy Niestety, tego też próbowałem - bez efektów.

0

Po pierwsze pom.xml dla aplikacji web jest nie jest kompletny. Po drugie musisz poinformować springa gdzie ma szukac klas z adnotacjami

Kopiuj
         AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("eu.its.web");

Plik pom wygenerowany przez netbeanse dla aplikacji web z dodanymi zależnościami na potrzeby twojej aplikacji:

Kopiuj
 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>pl.arek</groupId>
    <artifactId>Web</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>Web</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0-b01</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

Usuń adnotacje ComponentScan ze swoich klas i powinno działać. Oczywiście możesz rozdzielić konfigurację i w przykladzie wyżej podać lokalizację tylko jakiejś klasy konfiguracyjnej i tam konfigurować albo przez tworznie beanow albo dalej adnotacji.

Pozdrawiam

Lukasz_
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:140
0

@SkromnyKrawiec .setConfigLocation używałem, nie pomagało - dodatkowo źródła mówią, że używa defaultowej jeśli nie ustawisz innej i też powinno wtedy działać. Reszta twojego poma dodaje tylko info do budowania artefaktu, co robię i tak sam. W jakim celu dodajesz javaee web api i w czemu mam usunac setComponentScan ?

0

Wspomniałem o usunięciu tych adnotacji dlatego że jak użyjesz setConfigLocation to nie ma później potrzeby skanowania tych paczek jeszcze raz. Chyba że w setConfigLocation podasz tylko paczkę gdzie znajduje sie twoja konfiguracja to później w konfiguracji znów będziesz musiał w jakiś sposób powiedz springowi gdzie ma szukać reszty beanow czyli kontrolerow etc. po prostu zadbaj o to żeby każda paczka była przeskanowana tylko raz pomoże ci to uniknąć problemów z dostarczeniem kilku takich samych beanow co owocuje błędami. Po wprowadzonych modyfikacjach które ci opisałem wcześniej twój kod dziala. Dlaczego chcesz ręcznie budować wara ? nie rozumiem, skoro masz narzędzia do tego ?

Pozdrawiam

Lukasz_
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:140
0

@Skromny Krawiec Konkretnie która modyfikacja sprawiła że projekt Ci zadziałał ? Chcę to zrobić ręcznie bo lubię wiedzieć co się pod spodem dzieje. To nie jest projekt potrzebny na jutro, normalnie po prostu szukałbym w sieci, ale okazało się że jest zaskakująco ubogo jeśli chodzi o java config bez boota.

edytowany 2x, ostatnio: Lukasz_
1

poma już masz więc

Kopiuj
 package pl.arek.web.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@EnableWebMvc
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

}

tu chyba się nic nie zmieniło

Kopiuj
 package pl.arek.web;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;


public class AppInitializer implements WebApplicationInitializer {

    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("pl.arek.web");

        servletContext.addListener(new ContextLoaderListener(context));
        ServletRegistration.Dynamic dispatcher = servletContext.
                addServlet("DispatcherServlet", new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }

}

ale tak naprawde powinienes tu raczej podac paczke gdzie znajduje się tylko konfiguracja a pozniej za pomoca np @ComponentScan dodac kolejne mapowanie ale w tak by nie zawieralo już tych przeskanowanych paczek. Tak czy inaczej w taki prostacki sposob też działa. Jak pobrałem twoj kod to bez setConfigLocation spring nie odnajdywał twoich klas konfiguracyjnych.

Kopiuj
 package pl.arek.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MainController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    @ResponseBody
    public String showIndex() {
        return "hello world";
    }
}

reszte plikow wywaliłem bo nie byla potrzebna.

Pozdrawiam

Lukasz_
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:140
0

@Skromny Krawiec Super! Tak myślałem że nie skanuje odpowiednich pakietów. Teraz zreztą nadal nie skanuje ale przynajmniej wiem gdzie szukać problemu. A jesteś może w stanie wyjaśnić mi plik pom.xml który wysłałeś ? Które rzeczy są absolutnie niezbędne i które co dokładnie robią ? Rozumiem że to sporo pisania i wiedzy, ale jeśli nie to może chociaż odeślesz do jakiegoś dobrego źródła ? Dzięki !

0
Lukasz_
To widziałem, de facto miałem identycznie, brakowało pluginu w pom.xml. Dodatkowo nie ma tam setConfigLocation
Lukasz_
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:140
0

Wyrzuciłem trochę rzeczy z twojego configu, nadal działa. Dodatkowo stworzyłem pakiet pl.test.springtest bo najwyraźniej z jakiegoś powodu go nie było. Teraz interesuje mnie tylko ten fragment poma, bo ewidentnie konfiguruje on proces budowania artefaktu war i chciałbym wiedzieć dokładnie co on robi i jak.

Kopiuj
 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
Lukasz_
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:140
0

Udało mi się usunąć kolejne części tej konfiguracji bez psucia projektu. Zmiany na repo. Dodatkowo gdyby ktoś szukał informacji o sekcji build to tu jest sporo https://www.tutorialspoint.com/maven/maven_plugins.htm

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)