Spring Boot Restcontroller에서 여러 서비스를 사용할 때 ClassCastException 가져 오기

피터 룬드그렌

내 스프링 부트 애플리케이션은 컨트롤러에서 두 서비스에 액세스해야 할 때까지 꽤 잘 작동했습니다. CreateCompany 메소드에서 회사를 db에 저장하기 전에 사용자가 존재하는지 확인하고 싶습니다. 회사 데이터는 adminId 경로 변수와 마찬가지로 올바르게 수신됩니다.

이것은 한 번 작동하지만 동일한 사용자에 대해 다른 회사를 삽입하려는 경우 사용자를 조회하려고 할 때 ClassCastException이 발생합니다.

하지만 이상한 점은 다른 클래스에서 CompanyTagService를 사용하여 데이터베이스에 태그를 성공적으로 삽입한다는 것입니다. 디버깅시 CompanyTagService 개체로 표시되고 CompanyService 및 UserService는 프록시입니다. 이것은 나에게 의심 스럽지만 유용한 것을 알아내는 스프링 프록시에 대해서는 거의 알지 못합니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?

CompanyServiceBean.java

@RestController
@RequestMapping( value="/api/company")
public class CompanyController {

    @Value( "${application.config.logo_folder}" )
    private String logoFolder;

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private CompanyService service;

    @Autowired
    private CompanyTagService tagService;

    @Autowired
    private UserService uService;

    @RequestMapping( 
            value="/admin/{adminId}",
            method=RequestMethod.POST, 
            consumes=MediaType.APPLICATION_JSON_VALUE, 
            produces=MediaType.APPLICATION_JSON_VALUE )
    public ResponseEntity< ? > CreateCompany( @RequestBody Company company, @PathVariable( "adminId") Long adminId ){
        Company ret = null;
        ResponseEntity< ? > resp = null;
        User u = uService.findOne( adminId ); //This is where the exception occurrs.

        if( null != u )
            logger.info( "User {} was found.", u.getFirstName() );

        logger.info( "Creating company record for admin with id {}", adminId);

        if( u == null ){
            resp = new ResponseEntity< RestResult >( new RestResult( "The user id must be set", HttpStatus.BAD_REQUEST ), HttpStatus.BAD_REQUEST );
        }
        else {
            company.setAdminId(adminId);
            try{
                ret = service.create( company );
                resp = new ResponseEntity< Company >( ret, HttpStatus.CREATED );
            }
            catch( DataIntegrityViolationException ie ){
                resp = new ResponseEntity< RestResult >( new RestResult( "Company name or org. no. was already in use", HttpStatus.BAD_REQUEST ), HttpStatus.BAD_REQUEST);
            }
            catch( Exception e ){
                resp = new ResponseEntity< RestResult >( new RestResult( "Could not create the company.", HttpStatus.INTERNAL_SERVER_ERROR ), HttpStatus.INTERNAL_SERVER_ERROR);
            }
        }

        return( resp );
    }
... Other service methods

UserServiceBean.java :

@Service
@Transactional( propagation = Propagation.SUPPORTS, readOnly = true )
public class UserServiceBean implements UserService {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private UserRepository userRepo;

    @Override
    @CachePut( value="EntWeb", key="#result.id" )
    @Transactional( propagation = Propagation.REQUIRED, readOnly = false )
    public User create(User user) {
        User ret = null;

        if( user.getId() == null ) {
            ret = userRepo.save( user );
        }

        return( ret );
    }

    @Override
    @Cacheable( value="EntWeb", key="#id")
    public User findOne(Long id) {
        User ret = userRepo.findOne( id );

        return( ret );
    }

... Other Service methods

오류 출력

java.lang.ClassCastException: org.entweb.model.Company cannot be cast to org.entweb.model.User
at com.sun.proxy.$Proxy126.findOne(Unknown Source) ~[na:na]
at org.entweb.web.api.CompanyController.CreateCompany(CompanyController.java:58) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_77]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_77]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_77]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_77]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:817) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:731) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
Michał Zaborowski

내 마음에 유일한 문제는 캐시입니다. 즉, 다른 개체를 하나의 캐시에 넣습니다. 피터는 그것이 문제임을 확인했습니다.

이를 수정하려면 ... 두 가지 방법이 있습니다.

  • 하나는 전역 ID를 갖는 것입니다. 그러면 충돌없이 모든 캐시 호출이 유효 해집니다.
  • 다른 방법은 다른 현금을 갖는 것입니다. 장점 :
    • 기존 코드를 변경할 필요가 없습니다.
    • 각 클래스의 캐싱을 제어 할 수 있습니다.

이를 수행하려면 cachePut 사양을 참조하십시오. Values ​​속성은 업데이트해야하는 캐시를 알려주는 데 사용하는 속성이며이 특정 결과 개체를 포함합니다. 대부분의 프로젝트에서 사용하는 접두사를 점 - EntWeb.users.admins- 또는 어쩌면 entweb.users충분하다. 아름다움은 나중에 변경할 수 있다는 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Spring Boot를 사용하여 체크 박스 목록에서 컨트롤러로 선택한 값 가져 오기

분류에서Dev

WCF REST 서비스에서 typeof를 사용할 때 내 JSON에서 추가 속성 가져 오기

분류에서Dev

get 메소드를 사용할 때 서비스에서 널 오브젝트 참조 가져 오기

분류에서Dev

WCF 서비스를 테스트 할 때 NullRef 가져 오기

분류에서Dev

SQLAlchemy에서 setter를 사용할 때 AttributeError 가져 오기

분류에서Dev

R에서 Forecast ()를 사용할 때 예측 값 가져 오기

분류에서Dev

Spring Boot 응용 프로그램의 서비스 계층에서 요청에서 헤더 가져 오기

분류에서Dev

Google Play 서비스가 앱과 기기에서 다를 때 융합 위치를 사용하여 CurrentLocation 0 가져 오기

분류에서Dev

PHP codeigniter를 사용하여 Thumb 웹 서비스 가져 오기

분류에서Dev

Java를 사용하여 Windows 서비스 모드 가져 오기

분류에서Dev

MediaQuery를 사용하여 Material App 외부에서 ThemeData를 빌드 할 때 장치 밝기 가져 오기

분류에서Dev

Python에서 클래스를 사용할 때 올바른 값 가져 오기

분류에서Dev

여러 ingress-nginx 컨트롤러를 사용할 때 잘못된 Ingress 컨트롤러에서 주소를 가져 오는 Ingress 리소스

분류에서Dev

Spring Boot-Tiles + JSP를 사용할 때 단일 요청에서 MyFilter가 여러 번 호출되는 이유는 무엇입니까?

분류에서Dev

pouchdb를 사용하여 서비스 및 컨트롤러에서 allDocs 가져 오기

분류에서Dev

Google에 대해 Spring Boot OAuth2를 사용하여 인증 할 때 사용자를 허용 목록에 Google 사용자 이메일을 가져 오는 방법

분류에서Dev

gradle 2.12 및 2.13에서 spring-boot를 사용할 때 이상한 오류

분류에서Dev

JavaScript : 참조 된 함수를 사용할 때 짝수 핸들러에서 $ (this) 가져 오기

분류에서Dev

jquery를 사용하여 src 태그에 삽입 할 때 html 입력 필드에서 값 가져 오기

분류에서Dev

Dimple JS를 사용하여 시리즈를 클릭 할 때 데이터 세트에서 ID 가져 오기

분류에서Dev

thymeleaf, spring boot를 사용하여 확인란 목록 값 가져 오기

분류에서Dev

여러 가져 오기 요청 내 for 루프 내에서 가져 오기 사용

분류에서Dev

json을 사용하여 웹 서비스에서 데이터를 가져 오려고 할 때 데이터 매개 변수가 nil입니다.

분류에서Dev

Spring : REST 서비스를 사용하여 새 객체를 게시 할 때 유형 정의 오류

분류에서Dev

Android에서 SDK 3.15를 사용하여 Facebook으로 로그인 할 때 UserName 가져 오기

분류에서Dev

Spring Boot를 사용하여 RESTful 서비스를 AWS에 배포

분류에서Dev

PHP exec를 사용할 때 PDFTK에서 전체 오류 가져 오기

분류에서Dev

pythoncom에서 cx_freeze를 사용할 때 가져 오기 오류

분류에서Dev

서비스를 컨트롤러에 주입 할 때 Angular가 알 수없는 공급자 오류를 가져옴

Related 관련 기사

  1. 1

    Spring Boot를 사용하여 체크 박스 목록에서 컨트롤러로 선택한 값 가져 오기

  2. 2

    WCF REST 서비스에서 typeof를 사용할 때 내 JSON에서 추가 속성 가져 오기

  3. 3

    get 메소드를 사용할 때 서비스에서 널 오브젝트 참조 가져 오기

  4. 4

    WCF 서비스를 테스트 할 때 NullRef 가져 오기

  5. 5

    SQLAlchemy에서 setter를 사용할 때 AttributeError 가져 오기

  6. 6

    R에서 Forecast ()를 사용할 때 예측 값 가져 오기

  7. 7

    Spring Boot 응용 프로그램의 서비스 계층에서 요청에서 헤더 가져 오기

  8. 8

    Google Play 서비스가 앱과 기기에서 다를 때 융합 위치를 사용하여 CurrentLocation 0 가져 오기

  9. 9

    PHP codeigniter를 사용하여 Thumb 웹 서비스 가져 오기

  10. 10

    Java를 사용하여 Windows 서비스 모드 가져 오기

  11. 11

    MediaQuery를 사용하여 Material App 외부에서 ThemeData를 빌드 할 때 장치 밝기 가져 오기

  12. 12

    Python에서 클래스를 사용할 때 올바른 값 가져 오기

  13. 13

    여러 ingress-nginx 컨트롤러를 사용할 때 잘못된 Ingress 컨트롤러에서 주소를 가져 오는 Ingress 리소스

  14. 14

    Spring Boot-Tiles + JSP를 사용할 때 단일 요청에서 MyFilter가 여러 번 호출되는 이유는 무엇입니까?

  15. 15

    pouchdb를 사용하여 서비스 및 컨트롤러에서 allDocs 가져 오기

  16. 16

    Google에 대해 Spring Boot OAuth2를 사용하여 인증 할 때 사용자를 허용 목록에 Google 사용자 이메일을 가져 오는 방법

  17. 17

    gradle 2.12 및 2.13에서 spring-boot를 사용할 때 이상한 오류

  18. 18

    JavaScript : 참조 된 함수를 사용할 때 짝수 핸들러에서 $ (this) 가져 오기

  19. 19

    jquery를 사용하여 src 태그에 삽입 할 때 html 입력 필드에서 값 가져 오기

  20. 20

    Dimple JS를 사용하여 시리즈를 클릭 할 때 데이터 세트에서 ID 가져 오기

  21. 21

    thymeleaf, spring boot를 사용하여 확인란 목록 값 가져 오기

  22. 22

    여러 가져 오기 요청 내 for 루프 내에서 가져 오기 사용

  23. 23

    json을 사용하여 웹 서비스에서 데이터를 가져 오려고 할 때 데이터 매개 변수가 nil입니다.

  24. 24

    Spring : REST 서비스를 사용하여 새 객체를 게시 할 때 유형 정의 오류

  25. 25

    Android에서 SDK 3.15를 사용하여 Facebook으로 로그인 할 때 UserName 가져 오기

  26. 26

    Spring Boot를 사용하여 RESTful 서비스를 AWS에 배포

  27. 27

    PHP exec를 사용할 때 PDFTK에서 전체 오류 가져 오기

  28. 28

    pythoncom에서 cx_freeze를 사용할 때 가져 오기 오류

  29. 29

    서비스를 컨트롤러에 주입 할 때 Angular가 알 수없는 공급자 오류를 가져옴

뜨겁다태그

보관