Projekt Spring

0

Hej, tworzę projekt aplikacji ubezpieczniowej. Jakiś czas temu założyłem post na temat pewnej funkcjonalności aplikacji, teraz chciałbym go kontynuować.

Jest to projekt oparty na tutorialu ze strony: http://www.mkyong.com/spring-mvc/spring-mvc-form-handling-example/

Jako że jest to aplikacja firmy ubezpieczeniowej pierwszym modułem który chciałem zrobić było obliczenie składki ubezpieczenia. W 80% jest on zrobiony. Użytkownik wypełnia formularz, następnie dane te przesyłane są i zapisywane w bazie a potem można je odczytać

Chciałbym zwrócić się o pomoc w napisaniu fragmentu kodu wyliczającego taką składkę ubezpieczenia.
Składka będzie dotyczyła ubezpieczenia samochodu.

Jako przykładowe pole w formularzu które chciałbym wspólnie z Wami napisać będzie „zakresUbezpieczenia”. Posiada ono dwie wartości, „OC” i „OCiAC”. Jeżeli zostanie wybrana druga opcja chciałbym żeby pole „wartoscUbezpieczenia” miało wartość „1000”.

Przygotowałem wstępną implementację, utworzyłem metodę „obliczSkladkeUbezpieczenia” (oczywiście nie działa :)) jest ona zrobiona z jednym polem które ma posłużyć jako przykład, chciałbym uzyskać pomoc i zostać jakoś nakierowanym na właściwe rozwiązanie.

Pytanie 1: DAO, to w nim będzie implementacja wyliczania takiej składki?

Cały kod:
model: https://pastebin.com/WRW588A9
DAO: https://pastebin.com/Yfb3FD4d
serwis: https://pastebin.com/4Q7P7Gim
kontroler: https://pastebin.com/iv03gsqQ

Jeżeli ktoś będzie chciał, mogę wrzucić projekt na Git'a.

Fragmenty kodu:

Model:

public class UbezpieczenieSamochodu {
 Integer wartoscUbezpieczenia;

public Integer getWartoscUbezpieczenia() {
		
		//wartoscUbezpieczenia = 500;
		return wartoscUbezpieczenia;
	}
	public void setWartoscUbezpieczenia(Integer wartoscUbezpieczenia) {
		this.wartoscUbezpieczenia = wartoscUbezpieczenia;
	}
}


DAOImpl:

@Repository
public class UbezpieczenieSamochoduDAOImpl implements UbezpieczenieSamochoduDAO {
	
	NamedParameterJdbcTemplate namedParameterJdbcTemplate;

public void obliczSkladkeUbezpieczenia(UbezpieczenieSamochodu ubezpieczenieSamochodu) {
		KeyHolder keyHolder = new GeneratedKeyHolder();
		
		String sql =  "INSERT INTO ubezpieczeniaSamochodu(wartoscUbezpieczenia)"
				
				      +"VALUES( :wartoscUbezpieczenia)";
		
		if (ubezpieczenieSamochodu.getZakresUbezpieczenia() == "OCiAC") {
			ubezpieczenieSamochodu.setWartoscUbezpieczenia(1500);
			
			namedParameterJdbcTemplate.update(sql, getSqlParameterByModel(ubezpieczenieSamochodu),keyHolder);
			ubezpieczenieSamochodu.setId(keyHolder.getKey().intValue());
		}
	}


	private SqlParameterSource getSqlParameterByModel (UbezpieczenieSamochodu ubezpieczenieSamochodu) {
		
		MapSqlParameterSource paramSource = new MapSqlParameterSource();
		
		paramSource.addValue("id", ubezpieczenieSamochodu.getId());
		paramSource.addValue("zakresUbezpieczenia", ubezpieczenieSamochodu.getZakresUbezpieczenia());
		paramSource.addValue("wartoscUbezpiecznia", ubezpieczenieSamochodu.getWartoscUbezpieczenia());
		
		
		return paramSource;
	}

}

Serwis:

@Service("ubezpieczenieSamochoduService")
public class UbezpieczenieSamochoduServiceImpl implements UbezpieczenieSamochoduService {

UbezpieczenieSamochoduDAO ubezpieczenieSamochoduDAO;

@Override
	public void obliczSkladkeUbezpieczenia(UbezpieczenieSamochodu ubezpieczenieSamochodu) {
		ubezpieczenieSamochoduDAO.obliczSkladkeUbezpieczenia(ubezpieczenieSamochodu);
		
	}
}

Kontroler


@RequestMapping(value = "ubezpieczenia/{id}", method = RequestMethod.GET)
	public String showUbezpieczenieSamochodu(@PathVariable ("id") int id, Model model) {
		
		
		logger.debug("ShowUbezpieczenieSamochodu id: {}", id);
		
		UbezpieczenieSamochodu ubezpieczenieSamochodu = ubezpieczenieSamochoduService.findById(id);
		
		if (ubezpieczenieSamochodu == null) {
			model.addAttribute("msg", "Użytkownik nie znaleziony");
		}
		

		ubezpieczenieSamochoduService.obliczSkladkeUbezpieczenia(ubezpieczenieSamochodu);
		
		model.addAttribute("ubezpieczenieSamochodu", ubezpieczenieSamochodu);
		
		return "users/obliczonaSkladka";

                  private void populateDefaultModel(Model model) { 

                Map<String, String> zakresUbezpieczenia = new LinkedHashMap<String, String>();
		zakresUbezpieczenia.put("OC","OC");
		zakresUbezpieczenia.put("OCiAC","OC i AC");
		model.addAttribute("zakresUbezpieczenia", zakresUbezpieczenia);
}
	}
	}
0

Czy coś takiego ma prawo działać?


public void obliczSkladkeUbezpieczenia(UbezpieczenieSamochodu ubezpieczenieSamochodu) {
		
		if (ubezpieczenieSamochodu.getZakresUbezpieczenia() == "OCiAC") {
			ubezpieczenieSamochodu.setWartoscUbezpieczenia(1500);
			
			String sql =  "UPDATE ubezpieczeniaSamochodu SET wartoscUbezpieczenia=:wartoscUbezpieczenia";
			
			namedParameterJdbcTemplate.update(sql, getSqlParameterByModel(ubezpieczenieSamochodu));
			
		}
	}

1

Pytasz nas czy to ma prawo działać? Uruchom aplikację i sprawdź. Jeśli masz jakieś problemy, albo aplikacja się sypie to pisz na forum, wrzucaj log błędów i wtedy łatwiej będzie coś napisać. Tak na szybko z tego co widzę to napisałeś, że w DAO będziesz wyliczał wartość składki. Jest to raczej zły pomysł, DAO to tylko warstwa dostępu do danych. Logikę aplikacji wrzuć w serwisy, podobnie z kontrolerami tam również nie powinieneś wrzucać logiki biznesowej.
Co do poniższego fragmentu:

 if (ubezpieczenieSamochodu.getZakresUbezpieczenia() == "OCiAC")

Poczytaj o porównywaniu stringów, ponieważ nie należy ich porównywać operatorem == ponieważ on porównuje adresy. Do porównań stringów używaj metody equals, najlepiej w taki sposób, żeby zabezpieczyć się przed NPE:

 if ("OCiAC".equals(ubezpieczenieSamochodu.getZakresUbezpieczenia()))

Możesz też użyć jakiejś metody equals z klasy Objects, albo innej Guavy czy Apache.

0

Dzięki za

Poczytaj o porównywaniu stringów, ponieważ nie należy ich porównywać operatorem == ponieważ on porównuje adresy. Do porównań stringów używaj metody equals, najlepiej w taki sposób, żeby zabezpieczyć się przed NPE:

 if ("OCiAC".equals(ubezpieczenieSamochodu.getZakresUbezpieczenia()))

Udało mi się dokończyć wstępne wyliczanie składki

0

Zamieniłem if-else na switch'a ze stringami, w większości pól z których obliczana jest składka występuje taki switch. Nie powinno się przeszukiwać po stringach ze względu na spadek wydajności? Czy takie rozwiązanie jest akceptowalne, jak wy byście sobie z tym poradzili?

Map<String, String> pojemnoscSilnika = new LinkedHashMap<String, String>();
		pojemnoscSilnika.put("od_0.9_do_1.2","od 0.9 do 1.2");
		pojemnoscSilnika.put("od_1.2_do_1.6","od 1.2 do 1.6");
		pojemnoscSilnika.put("od_1.6_do_2.0","od 1.6 do 2.0");
		pojemnoscSilnika.put("od_2.0_do_3.0","od 2.0 do 3.0");
		pojemnoscSilnika.put("Powyzej_3.0","Powyżej 3.0");
		model.addAttribute("pojemnoscSilnika", pojemnoscSilnika);

	switch (ubezpieczenieSamochodu.getPojemnoscSilnika()) {
		case "od_0.9_do_1.2":
			wartoscPolaPojemnoscSilnika = 100;
			break;
		case "od_1.2_do_1.6":
			wartoscPolaPojemnoscSilnika = 200;
			break;
		case "od_1.6_do_2.0":
			wartoscPolaPojemnoscSilnika = 300;
			break;
		case "od_2.0_do_3.0":
			wartoscPolaPojemnoscSilnika = 400;
			break;
		case "Powyzej_3.0":
			wartoscPolaPojemnoscSilnika = 500;
			break;

		}
1

Na patrzyłem na resztę kodu ale to powyżej to cięzki WTF. Mógłbyś choćby zrobić mape string->int od biedy, żeby nie robić takich switchy bez sensu. Ale w ogóle sensowniej byłoby użyć Strategii i zrobić sobie klasy do reprezentacji tych pojemności silnika, które będą zawierać w sobie odpowiednie parametry.

0

Dzięki za odpowiedź i nakierowanie na rozwiązanie. Z tą mapą zrobiłem tak jak wyżej bo tak było w tutorialu (co oczywiście nie znaczy że do tego co chciałem zrobić okazało się dobre). Myślałem o zmianie na "string -> int" ale pojawia się kilka komplikacji, myślę że nie ma sensu tego zmieniać korzystając z HSQLDB, są lepsze i gotowe rozwiązania w np. Hibernate z którego docelowo chcę korzystać.

0

Dobrze by było gdybyś jeszcze zaczął pisać kod w języku angielskim. Takie mieszanie polskiego i angielskiego to bardzo zła praktyka i chyba tylko w jakichś Januszsoftach można natknąć się na taki kod.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.