2015-11-06 164 views
1

我定義UserControllerUserRepositoryUser這樣RestController返回500錯誤而不堆棧跟蹤

UserController.java

import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

import org.apache.commons.lang3.RandomStringUtils; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.crypto.codec.Hex; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

import com.zusn.domain.User; 
import com.zusn.repository.UserRepository; 

@RestController 
@RequestMapping(value = "/user") 
public class UserController { 
    @Autowired 
    private UserRepository userRepository; 

    @RequestMapping(value = "/create", method = RequestMethod.POST) 
    public User createUser(@RequestBody User newUesr) throws NoSuchAlgorithmException{ 
     User user = userRepository.findByUidAndDevice(newUesr.getUid(), newUesr.getDevice()); 
     if(user == null){ 
      MessageDigest md = MessageDigest.getInstance("SHA"); 
      Long now = System.nanoTime(); 
      md.update(now.byteValue()); 
      String random = RandomStringUtils.randomAlphabetic(32); 
      md.update(random.getBytes()); 
      newUesr.setConsumerKey(String.valueOf(Hex.encode(md.digest()))); 
      return userRepository.save(newUesr); 
     }else{ 
      return user; 
     } 
    } 
} 

UserRepository.java

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.repository.query.Param; 
import org.springframework.stereotype.Repository; 

import com.zusn.domain.Devices; 
import com.zusn.domain.Providers; 
import com.zusn.domain.User; 

@Repository 
public interface UserRepository extends JpaRepository<User, Long>{ 
    /** 
    * 
    * @param uid UID 
    * @param provider Profider ex) twitter, google+, facebook 
    * @return User 
    */ 
    public User findByUidAndProvider(@Param("uid") String uid, @Param("provider") Providers provider); 

    /** 
    * 
    * @param uid UID 
    * @param devices Device ex) iOS, Android 
    * @return User 
    */ 
    public User findByUidAndDevice(@Param("uid")String uid, @Param("device") Devices device); 
} 

User.java

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 


@Entity 
@Table(name = "users") 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", nullable = false) 
    private Long id; 

    @Column(name = "uid", nullable = false) 
    private String uid; 

    @Column(name = "provider") 
    private Providers provider; 

    @Column(name = "device", nullable = false) 
    private Devices device; 

    @Column(name = "consumer_key", nullable = false, unique = true) 
    private String consumerKey; 

    @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY) 
    private Profile profile; 



    public User() { 
     super(); 
    } 

    public User(String uid, Providers providers, String consumerKey) { 
     super(); 
     this.uid = uid; 
     this.provider = providers; 
     this.consumerKey = consumerKey; 
    } 

    public String getConsumerKey() { 
     return consumerKey; 
    } 

    public void setConsumerKey(String consumerKey) { 
     this.consumerKey = consumerKey; 
    } 

    public User(Providers provider){ 
     this.provider=provider; 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getUid() { 
     return uid; 
    } 

    public void setUid(String uid) { 
     this.uid = uid; 
    } 

    public Providers getProvider() { 
     return provider; 
    } 

    public void setProvider(Providers provider) { 
     this.provider = provider; 
    } 

    public Profile getProfile() { 
     return profile; 
    } 

    public void setProfile(Profile profile) { 
     this.profile = profile; 
    } 

    public Devices getDevice() { 
     return device; 
    } 

    public void setDevice(Devices device) { 
     this.device = device; 
    } 

} 

當用戶不存在時,換句話說處理第一個if語句時,此方法返回新的User對象。但是當用戶已經存在時,它返回狀態碼500.
然後當它返回500錯誤時它不打印堆棧跟蹤。

所以我不知道它爲什麼會返回500錯誤。請告訴我這段代碼有什麼問題,以及爲什麼它返回500錯誤。

回答

0

沒有堆棧跟蹤很難猜測問題。也許@NoOne是正確的,但也許你在數據庫中有一個獨特的限制,留在舊的開發中。

如果你沒有看到stacktrace客戶端,你可以把this snipped去得到stacktrace服務器端。因爲5xx錯誤只是告訴smth。在服務器上出錯了。

0

首先,我想你可能會處理由Spring Data JPA層引發的DataAccessException。對於500錯誤,我認爲這可能是延遲加載的問題。當你第一次在數據庫中插入對象實體時,我認爲這是一種不同的行爲。你使用什麼服務器?它是一個tomcat嗎?如果是的話,你如何監控你的日誌?根據您的配置,某些日誌在標準catalina.out文件中不可見。您需要檢查localhost日誌文件以查看堆棧跟蹤。