Как я могу передать строковый параметр в пользовательский метод хранилища? - PullRequest
0 голосов
/ 17 октября 2018

У меня проблема с AJAX + Rest + Spring boot + MySQL.Запрос является успешным, но ответ пустой, независимо от формата, используемого в запросе.Фактически, полезная нагрузка запроса показывает ["customer": "MyCustomer"], так что проблема в контроллере, я думаю.

Функция AJAX ajax_ciudad (customer) {// onchange en select box

$.ajax({
    type: "POST",
    contentType: "application/json",
    url: "/api/ciudades",
    data: JSON.stringify(customer),
    dataType: 'json',
    cache: false,
    timeout: 600000,
        }).then(function(data) {
            DO SOMETHING.... 
           });
        });

}

CONTROLLER

@RestController
@RequestMapping
public class SearchController {
@Autowired
    private MyRepository myRepository;
    @PostMapping("/api/ciudades")
    public @ResponseBody List<?> getSedes(String customer){

        List<Canal> ciudades = myRepository.findBySede(customer);
        return ciudades;
    }


REPOSITORY
    @Query(value ="SELECT * FROM canal WHERE cliente = ?1", nativeQuery = true)
    List<Canal> findBySede(@Param("customer") String customer);

... Всегда возвращать пустой объект []

введите описание изображения здесь

Я пробовал несколько форматов для данных, я пытался получить значение Select, используя .val (), чтобы получить строку, используя .value, чтобы получить значение html .... Если я поставил вручную параметр, такой как myRepository.findBySede ("MyString ") ответ ajax содержит информацию, но когда я передаю значение, оно не работает;Что я делаю не так?Спасибо за вашу помощь

Мой класс сущности

@Entity
@Table(name = "canal")
public class Canal { 

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "idcanal", unique = true, nullable = false)
    int id;
    @Column(name = "cliente")
    String cliente;
    @Column(name = "ciudad")
    String ciudad;
    @Column(name = "sede")
    String sede;
    @Column(name = "canal")
    String canal;
    @Column(name = "ip_pe")
    String ip_pe;
    @Column(name = "nombre_pe")
    String nombre_pe;
    @Column(name = "ipwan_pe")
    String ipwan_pe;
    @Column(name = "puerto_pe")
    String puerto_pe    ;
    @Column(name = "ipwan_router")
    String ipwan_router;
    @Column(name = "enrutamiento")
    String enrutamiento;
    *****getters and setters****
     }

1 Ответ

0 голосов
/ 17 октября 2018

Я надеюсь, что вы правильно определили репо и вернули правильные данные на основе строки клиента.

Передайте из ajax "customer" как @Param и определите свой контроллер следующим образом: @RestController включает @Controller и @ResponseBody:

@RestController
public class SearchController {
    @Autowired
    private MyRepository myRepository;

    @PostMapping("/api/ciudades")
    public List<Canal> getSedes(@Param("customer") String customer){

        List<Canal> ciudades = myRepository.findBySede(customer);
        return ciudades;
    }

Или лучше, вернуть ResponseEntity ..

@RestController
public class SearchController {
    @Autowired
    private MyRepository myRepository;

    @PostMapping("/api/ciudades")
    public ResponseEntity<?> getSedes(@Param("customer") String customer){

        List<Canal> ciudades = myRepository.findBySede(customer);
        return new ResponseEntity<>(ciudades , HttpStatus.OK);
    }

Определите свой метод в репо следующим образом:

@Repository|
public interface MyRepository extends CrudRepository<Canal, String> 

    @Query(value ="SELECT * FROM canal GROUP BY cliente", nativeQuery = true)
    List<Canal> findByIdcanal(); // works fines

  //I assume here you have canal table and cliente is column in it as you 
   running native query

    @Query(value ="SELECT * FROM canal WHERE cliente = ?1", nativeQuery = true)
    List<Canal> findBySede(String customer); // doesn't work

  //OR try this as JPQL if you have Canal is entity and cliente as string type in it.
    @Query(value ="Select c from Canal c WHERE c.cliente = :cliente")
    List<Canal> findBySede(@Param("cliente") String customer); 

   //OR simply have Named query I assume you have Canal and cliente string type

   List<Canal> findByCliente(String customer); 


}

ОБНОВЛЕНИЕ , поскольку я проверил, что ваш собственный запрос в порядке ..

Если вы хотите отправить клиента (строку) как @RequestBody в контроллере, выполните следующие действия:

  1. Создание класса клиента

    public class Customer {
    private String customer;
    
    public String getCustomer() {
        return customer;
    }
    
    public void setCustomer(String customer) {
        this.customer = customer;
    }
    

    }

  2. обрабатывать запрос как @RequestBody

    @PostMapping("/api/ciudades")
    public ResponseEntity<?> getSedes(@RequestBody Customer customer){
    
        List<Canal> ciudades = myRepository.findBySede(customer.getCustomer());
        return new ResponseEntity<>(ciudades , HttpStatus.OK);
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...