개발자의 오르막

REST 기반 GET 방식 중 NULL 값 처리 본문

Trouble Shouting

REST 기반 GET 방식 중 NULL 값 처리

계단 2019. 10. 7. 21:22

이건 좀 커스터마이징이 필요했던 부분이다. 

 

우선 화면 단에서 정보를 어떻게 넘겨주는 지 부터 보여주도록 하겠다!

 

# 화면.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 란 객체로 안정해주면 에러가 속출하던데..

  (테이블 재설계할 때 많이 해봤는데 잘 안됨. ㅠㅠ)

 


 

 

 

 

Comments