Spring MVC NumberFormatException

Odpowiedz Nowy wątek
2016-01-23 13:29

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Przy zwracaniu danych do widoku mam podany niżej błąd. Mógłby ktoś coś poradzić?

@Entity
    @Table(name="Product")
    public class Product {
        @Id
        @GeneratedValue
        private int idProduct;
        private String status;
        private String name;
    @OneToMany(mappedBy = "product")
        private List <Repository> repository;

    @Entity
    @Table(name="Repository")
    public class Repository {

        @Id
        private int idRepository;
        private int quantity;
        private double unitPrice;

        @ManyToOne
        private Product product;

view:

<c:forEach items="${products.repository}" var="product">
                            <p>${product.unitPrice}</p>
                            </c:forEach>

ERROR:


java.lang.NumberFormatException: For input string: "repository"

i drugie pytanie, jak zrobić żeby pętla w widoku obracała się wybraną ilość razy? Przykładowo jak chciałbym wyciągnąć tylko pierwszy obiekt listy

edytowany 2x, ostatnio: marek527, 2016-01-23 13:32

Pozostało 580 znaków

2016-01-23 16:02
Moderator

Rejestracja: 16 lat temu

Ostatnio: 6 godzin temu

0
  1. Błąd jest w ZUPEŁNIE INNYM MIEJSCU niż kod który nam pokazałeś. Gdzie? Przeanalizuj stacktrace.
  2. Wrzuć do widoku listę obciętą. Widok ma TYLKO wypisywać to co dostanie z backendu. Wszelkie operacje na danych wykonuje sie po stronie serwera!

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2016-01-23 17:29

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Jak mam to wykonać po stronie backendu, jeśli w widoku wszystkie dane wyciągam z obiektu typu Product?

edytowany 1x, ostatnio: marek527, 2016-01-23 17:30

Pozostało 580 znaków

2016-01-23 17:32
Moderator

Rejestracja: 16 lat temu

Ostatnio: 6 godzin temu

0

Nie powinieneś w ogóle przesyłać i przetwarzać gdzieś obiektów encyjnych. Powinieneś tworzyć niemutowane obiekty DTO przechowujące TYLKO te dane którymi jesteś zainteresowany i w warstwie serwisów dokonywać translacji encji pobranych z DAO do formatu DTO który jest potrzebny w widoku.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

marekk527
2016-01-23 19:43
marekk527
0

Czy utworzenie takiego DAO jest KONIECZNE do korzystania z usług REST-owych i Ajax?

Pozostało 580 znaków

2016-01-23 21:10
Moderator

Rejestracja: 16 lat temu

Ostatnio: 6 godzin temu

0

Nie, ale równie dobrze można też napisać cały kod w jednej wielkiej funkcji main() ;]


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2016-01-23 21:30

Rejestracja: 4 lata temu

Ostatnio: 1 dzień temu

0
Shalom napisał(a):

Nie powinieneś w ogóle przesyłać i przetwarzać gdzieś obiektów encyjnych. Powinieneś tworzyć niemutowane obiekty DTO przechowujące TYLKO te dane którymi jesteś zainteresowany i w warstwie serwisów dokonywać translacji encji pobranych z DAO do formatu DTO który jest potrzebny w widoku.

Dlaczego? Przed jakimi sytuacjami to zabezpiecza?

Pozostało 580 znaków

2016-01-23 22:05
Moderator

Rejestracja: 16 lat temu

Ostatnio: 6 godzin temu

1

@InterruptedException na przykład przed tym że ktoś podciągnie ci @Transactional gdzieś wyżej a ty będziesz sobie majstrował przy obiektach wyciągniętych z bazy myśląc że są już "odpięte" i nagle się okaże że z bazy znikają ci dane nie wiadomo gdzie (tak, widziałem taki problem w dość sporym projekcie ;]). Albo że przypadkiem dociągasz sobie jakieś dowiązania Lazy generując miliony zapytań do bazy (taki problem też widziałem, ma nawet swoją nazwę n+1 select problem).

Poza tym tak generalnie to ułatwia testowanie i modyfikowanie systemu bo kolejne warstwy systemu zależą tylko od pewnego genralnego interfejsu. Dzięki takiemu podejściu możesz całkowicie przebudować warstwę DAO i nie martwić sie tym że Widok albo Serwisy polegają gdzieś na twoich klasach encyjnych (których teraz wcale nie chcesz na przykład mieć).


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2016-01-23 22:06

Pozostało 580 znaków

marekk527
2016-01-23 22:32
marekk527
0

Piszę złożoną aplikację z wykorzystaniem Ajax i usług REST i mam następujący problem.

Wyświetlam sobie pozycje w koszyku na stronie za pomocą dyrektywy AngularJS, jednak pętla nie obraca się ani razu. Wygląda to tak że Mapa cartItems jest po prostu pusta.
.jsp


<tr ng-repeat="item in cart.cartItems">
                    <td>{{item.product.productId}}-{{item.product.name}}</td>

JavaScript - metoda kontrolera interfejsu użytkownika:


  $scope.addToCart = function(productId) {
                                $http.put('/webstore/rest/cart/add/'+productId)
                                     .success(function(data) {
                                                $scope.refreshCart($http.get('/webstore/rest/cart/get/cartId'));
                                                alert("Produkt pomyślnie dodany do koszyka!");
                                            });
                            };

CartRestController:


@RequestMapping(value = "/add/{productId}", method = RequestMethod.PUT)
    @ResponseStatus(value = HttpStatus.NO_CONTENT)
    public void addItem(@PathVariable String productId, HttpServletRequest request) {

        String sessionId = request.getSession(true).getId();
        Cart cart = cartService.read(sessionId);
        if(cart== null) {
            cart = cartService.create(new Cart(sessionId));
        }

         int pom=Integer.valueOf(productId);
        Produkt product = productService.findByidProdukt(pom);

        cart.addCartItem(new CartItem(product));

        cartService.update(sessionId, cart);
    }

Cart:


public void addCartItem(CartItem item) {
        String productId = String.valueOf(item.getProduct().getIdProdukt());

        if(cartItems.containsKey(productId)) {
            CartItem existingCartItem = cartItems.get(productId);
            existingCartItem.setQuantity(existingCartItem.getQuantity()+item.getQuantity());
            cartItems.put(productId, existingCartItem);
        }
        else {
            cartItems.put(productId, item);
        }

        updateGrandTotal(); 
    }

CartItem:

public class CartItem {

    private Produkt product;
    private int quantity;
    private BigDecimal totalPrice; 

    public CartItem() {

    }
    public CartItem(Produkt product) {
        super();
        this.product=product;
        this.quantity=1;
        this.totalPrice = product.getUnitPrice;
    }

Zdaję sobie sprawę że ciężko jest dostrzec tutaj błąd no ale długo się z tym męczę dlatego postanowiłem to wrzucić na form. Próbowałem użyć debuggera ale marne wnioski z tego. Jakby ktoś zechciał przeanalizować kod i mi coś podpowiedzieć to będę niezwykle wdzięczny.

Pozostało 580 znaków

Krzywy Młot
2016-01-24 00:09
Krzywy Młot
0

Ten exception wyrzucany jest gdy następuje próba przekonwertowania Stringa na Int'a. Poszukaj w kodzie wyrażeń typu Integer.ValueOf(),a przede wszystkim Przeanalizuj (możesz również wrzucić tutaj) stacktrace - tam będzie odpowiedź gdzie wystąpił błąd.

Ale to działa, nie wyrzuca mi żadnego wyjątku. Po prostu Mapa CartItems nie jest wypełniana i nie wiem dlaczego. - marek527 2016-01-24 00:22

Pozostało 580 znaków

2016-01-24 00:14
Moderator

Rejestracja: 16 lat temu

Ostatnio: 6 godzin temu

0

@marekk527 trudno zobaczyć błąd skoro pokazujesz ZUPEŁNIE INNY KOD niż ten z którym masz problem. Jak debugujesz ten fragment to mnie nie dziwi że nic nie znalazłeś.

Piszę złożoną aplikację z wykorzystaniem Ajax i usług REST

Zapomnij. Jeszcze długa droga przed tobą bo teraz to można powiedzieć że co najwyżej sklejasz losowe kawałki kodu z internetu i modlisz się zeby coś zadziałało.

Zapnij debugger w metodzie kontrolera który pobiera dane z bazy i przesyła je do widoku w którym ci sie nie wyświetlają. Będziesz wtedy widział czy z bazy cokolwiek się pobrało.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Mogę wrzucić resztę kodu, bardzo mi zależy na szybkim rozwiązaniu. Powiedz jaką klasę mam wrzucić. Analizuje to już długo. CartItems jest puste i nie wiem dlaczego. - marek527 2016-01-24 00:20

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0