2016-01-10 4 views
0

Я пытаюсь фильтровать продукты в соответствии с ценовым диапазоном высокого и низкого уровня. И это URL я тестирую сПроблема сравнения BigDecimal в методе

http://localhost:8080/webstore/products/test?high=900&low=100

Это мой Repository (ProductRepository)

public interface ProductRepository { 
    List<Product> getProductsByPriceFilter(BigDecimal high, BigDecimal low); 
} 

Это мой InMemoryProductRepository класс, который имеет исходные данные и этот метод

public List<Product> getProductsByPriceFilter(BigDecimal high, BigDecimal low){ 
     List<Product> productsByPriceFilter = new ArrayList<Product>(); 

     for(Product product : listOfProducts){ 
      if((product.getUnitPrice().compareTo(high) < -1) && (product.getUnitPrice().compareTo(high)== 0) && (product.getUnitPrice().compareTo(low) > 1) && (product.getUnitPrice().compareTo(low)==0)){ 
       productsByPriceFilter.add(product); 
      } 
     } 
     return productsByPriceFilter; 
    } 

вот моя услуга (ProductServ лед)

public interface ProductService { 
    List<Product> getProductsByPriceFilter(BigDecimal high, BigDecimal low); 
} 

А вот моя реализация сервиса (ProductServiceImpl), которые состоят из этого метода

public List<Product> getProductsByPriceFilter(BigDecimal high, BigDecimal low){ 
     return productRepository.getProductsByPriceFilter(high, low); 
    } 

И, наконец, вот мой ProductController

@RequestMapping("/products/test") 
    public String getProductsByPriceFilter(@RequestParam("high") BigDecimal high, @RequestParam("low") BigDecimal low, Model model){ 
     model.addAttribute("product", productService.getProductsByPriceFilter(high, low)); 
     return "products"; 
    } 

Но я постоянно получаю пустая страница без данных всех данных, которые я прошел в высоком или низком состоянии. Итак, я думаю, проблема лежит с моим getProductsByPriceFilter метод в InMemoryProductRepository класс.

+1

То же целое число, не может быть> -1 и == 0, в то же время. Ваше состояние никогда не будет правдой. Вероятно, вы хотите 'price.compareTo (low)> = 0 && price.compareTo (высокий) <= 0' –

+1

Условие .compareTo() <-1 неверно. Вы всегда должны сравнивать результат compareTo() с нолем. –

ответ

0

Проблема заключается здесь в вашем сравнении:

if((product.getUnitPrice().compareTo(high) < -1) && (product.getUnitPrice().compareTo(high)== 0) && (product.getUnitPrice().compareTo(low) > 1) && (product.getUnitPrice().compareTo(low)==0)){ 

Где вы не можете сказать high результат сравнения может быть меньше, чем -1 и в то же время, равное zero. Вместо этого вам нужно или между двумя условиями или лучше <= 0 и другим путем для low как:

if((product.getUnitPrice().compareTo(high) <= 0) && (product.getUnitPrice().compareTo(low) >= 0)) 
+0

Я исправил это, но верно ли отображение контроллера mu? Потому что я не получаю никаких данных. Я новичок в учебе весной – user3127109

+0

Предполагаю, вы говорите, что не получаете никаких продуктов на своей веб-странице. Это похоже на другой вопрос. Вы должны ввести некоторые отладочные операторы и посмотреть, действительно ли вы получаете действительные высокие и низкие значения, и если вы возвращаете что-либо в своем списке продуктов. –