개발자의 오르막
REST 기반 GET 방식 중 NULL 값 처리 본문
이건 좀 커스터마이징이 필요했던 부분이다.
우선 화면 단에서 정보를 어떻게 넘겨주는 지 부터 보여주도록 하겠다!
# 화면.js
window.onload = function(){
var id = [[${#authentication.principal.member.id}]];
var obj = {id : id};
alert(obj.id);
(function(){
// load stores
storeManager.getAll(obj, printList);
})();
function printList(list){
var str = "";
var storeObj;
for(var i=0; i<list.length; i++){
storeObj = list[i];
str += "<tr>" +
"<td>" + storeObj.storeName+ " </td>" +
"<td>현상금</td>" +
"<td>기간</td>" +
"<td>리뷰현황</td>" +
"<td>" + storeObj.storeAddress1 + " " + storeObj.storeAddress2 + "</td>" +
"</tr>";
}
$("#storeTable").html(str);
}
}
var storeManager = (function(){
alert('들어왔오');
var getAll = function(obj, callback){
console.log("get ALL.....");
$.getJSON('/store/' + obj.id, callback);
};
return{
getAll: getAll
}
})();
- 처음엔 파라미터로 url 을 요청하려고 했었는데,, 잘 안돼서 window.onload 로 GET 방식으로 불렀다.
짜잘짜잘한 에러 다 고치고 나니까, 일단 컨트롤러가 Load 되긴 됐다.
# RestStoreController
@GetMapping(value = "/{id}", produces = { MediaType.APPLICATION_JSON_VALUE })
private ResponseEntity<List<Store>> getListAllById(@PathVariable("id") Long id) {
System.out.println("getListStoreById=======================================");
Member member = new Member();
member.setId(id);
System.out.println("member 는 제대로 들어왔어요" + member.getId());
return new ResponseEntity<>(storeRepo.getStoresOfId(member), HttpStatus.OK);
}
# StoreRepository
public interface StoreRepository extends JpaRepository<Store, Long>{
@Query("SELECT s FROM Store s WHERE s.user = ?1 "
+ "AND s.storeNum > 0 ORDER BY s.storeNum ASC")
public List<Store> getStoresOfId(Member user);
}
# Error 내용
java.lang.NullPointerException: null
- 지금 상태는 member는 제대로 들어왔어요 까지 출력된 상태이다...
그리고 49번째 줄인 return 부분의 storeRepo.getStoresOfId(member) 의 리턴값이 없다는 말인데,
DB에는 3개의 가게정보가 들어가있는 상태이다..
- 그러면 Query를 점검해보자!!
@Query("SELECT s FROM Store s WHERE s.user = ?1 ")
public List<Store> getStoresOfId(Member user);
우선 간결화시켜줬고,
# Store 도메인
@Getter
@Setter
@Entity
@Table(name = "tb_store")
@EqualsAndHashCode(of="storeNum")
@ToString(exclude="user")
public class Store {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long storeNum;
private String storeName;
private String storePhone;
private String storeAddress1;
private String storeAddress2;
private String businessTime;
private String storeHoliday;
private String sotreIntro;
@JsonIgnore
@ManyToOne(fetch=FetchType.LAZY)
private Member user;
}
컨트롤러에서 id가 저장된 member 객체를 파라미터 값으로 줬는데, Null 포인트가 나온다..
그럼 Query 가 잘못됐거나, member 파라미터로 쓰지 말던가.
public interface StoreRepository extends JpaRepository<Store, Long>{
@Query("SELECT s FROM Store s WHERE s.user = ?1 ")
public List<Store> getStoresOfId(Long id);
}
이렇게 수정해봤지만, 증상은 똑같았다.. 그럼 쿼리가 문제라고 확신하고, 구글링을 해봐야겠다.
아님 그냥 써볼까.접두어,
List<Store> findAllById(Member user);
- 이렇게 바꿔서 시도해보긴 햇는데, 파라미터로 Long id를 주기도 했고, 근데 다 바꿔줘도 많이 꼬인다.
StoreRepository.findAllById(com.catchreview.join.domain.Member)! No property id found for type Store!
뭐 이런 애러가 나오는데, property를 위의 Member user 란 객체로 안정해주면 에러가 속출하던데..
(테이블 재설계할 때 많이 해봤는데 잘 안됨. ㅠㅠ)
'Trouble Shouting' 카테고리의 다른 글
No default constructor for entity jpa (0) | 2019.10.30 |
---|---|
IntelliJ 자바 컴파일 및 인코딩 에러 문제 (0) | 2019.10.22 |
Spring Boot + Tyemeleaf + Security Tips (0) | 2019.10.07 |
(Node.JS) CSS status cancled -> URL 앞에 / 붙임? (0) | 2019.10.04 |
[Node.js]cors header 'access-control-allow-origin' missing (0) | 2019.10.01 |