@Springfield - Override

Code

package com.u2ware.springfield.sample.part3.step2;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import com.u2ware.springfield.config.Springfield;
import com.u2ware.springfield.config.Springfield.Strategy;
import com.u2ware.springfield.repository.QueryMethod;
import com.u2ware.springfield.sample.part3.step1.TargetBean;

@Springfield(
	strategy=Strategy.JPA, 
	entity=TargetBean.class
)
@QueryMethod("findByIdAndPasswordOrderByAgeDesc")
public @ToString class CustomBean {
	
	@Getter @Setter private String id;
	@Getter @Setter private String password;
}
		
package com.u2ware.springfield.sample.part3.step2;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.u2ware.springfield.domain.EntityPageable;
import com.u2ware.springfield.repository.EntityRepository;
import com.u2ware.springfield.sample.part3.step1.TargetBean;
import com.u2ware.springfield.service.EntityServiceImpl;

@Service
public class CustomBeanService extends EntityServiceImpl<TargetBean, CustomBean>{

	@Autowired @Qualifier("targetBeanRepository")
	private EntityRepository<TargetBean, String> targetBeanRepository;

	@Override
	protected EntityRepository<TargetBean, ?> getRepository() {
		return targetBeanRepository;
	}
	
	@Override
	@Transactional
	public Iterable<?> findForm(CustomBean request, EntityPageable pageable) {
		logger.debug("Overide findForm ");
		return super.findForm(request, pageable);
	}
}
		
package com.u2ware.springfield.sample.part3.step2;

import org.springframework.stereotype.Service;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;

import com.u2ware.springfield.sample.part3.step1.TargetBean;
import com.u2ware.springfield.validation.EntityValidatorImpl;

@Service
public class CustomBeanValidator extends EntityValidatorImpl<TargetBean, CustomBean>{

	@Override
	public void create(TargetBean target, Errors errors) {
		super.create(target, errors); //JSR-303
		logger.debug("Overide create ");
		ValidationUtils.rejectIfEmpty(errors, "password", "errorCode");
	}
}
		

Beans

@Springfield(strategy=Strategy.JPA, entity=TargetBean.class) 선언으로 다음 3개의 Bean 이 등록 된다. 자동생성 하려는 Bean(Name)이 이미 존재한다면, @Springfield 는 Bean 을 따로 생성하지 않는다.

bean name bean type bean implement
"customBeanController"EntityController<TargetBean, CustomBean>com.u2ware.springfield.controller. EntityHandler
"customBeanValidator" EntityValidator<TargetBean, CustomBean> com.u2ware.springfield.sample.part3.step2. CustomBeanValidator
"customBeanService" EntityService<TargetBean, CustomBean> com.u2ware.springfield.sample.part3.step2. CustomBeanService
Note:
CustomBeanService 에서 주입받은 "targetBeanRepository" Bean 은 이전 예제에서 이미 등록되어 있다.

RequestMapping

매핑 경로 HTTP Method Controller Method 이름 예제 Command 객체 예제 매핑 경로
/{topLevelMapping}/ GET home() CustomBean/part3/step2/
/{topLevelMapping} GET findForm() CustomBean/part3/step2
/{topLevelMapping} POST find() CustomBean/part3/step2
/{topLevelMapping}/{id} GET read() TargetBean/part3/step2/bar
/{topLevelMapping}/new GET createForm()TargetBean/part3/step2/new
/{topLevelMapping}/new POST create() TargetBean/part3/step2/new
/{topLevelMapping}/{id}/editGET updateForm()TargetBean/part3/step2/bar/eidt
/{topLevelMapping}/{id}/editPUT update() TargetBean/part3/step2/bar/eidt
/{topLevelMapping}/{id}/editDELETEdelete() TargetBean/part3/step2/bar/eidt

Validation Layer

Bean Name 규칙이 맞도록, EntityValidator 의 구현체를 작성하고 등록한다. EntityValidatorImpl 를 상속하여 구현이 가능하다.

com.u2ware.springfield.validator.EntityValidatorImpl

EntityValidatorImplJSR-303 Bean Validation 을 처리하는 Validator 컴퍼넌트이다

예제에서, 중복키 여부를 체크하여 에러를 reject 하는 방식이 사용되었는데, 이는 org.springframework.validation.Validator 의 구현방식과 동일하다.