2014-02-18 3 views
0

Я пытаюсь внедрить REstful Web Services с помощью Spring MVC. Сначала я сделал это без использования концепции HATEOAS. Я возвращал объекты домена, и он работал нормально. Теперь я пытаюсь реализовать HATEOAS для тех же методов в контроллере, и он дает ошибку. Может кто-нибудь, пожалуйста, помогите мне?Ошибка при внедрении HATEOAS весной

Мой домен Класс ниже:

import javax.xml.bind.annotation.XmlRootElement; 
import org.springframework.hateoas.ResourceSupport; 

/** 
* The {@link XmlRootElement} annotation is needed for the XML representation. 
* 
* @author Daniel Sawano 
* 
*/ 
@XmlRootElement(name = "user") 
public class User extends ResourceSupport{ 

private int userId; 
private String name; 

public User() { 
} 

public int getUserId() { 
    return userId; 
} 

public void setUserId(int userId) { 
    this.userId = userId; 
} 

public User(int id, String name) { 
    this.userId = id; 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

} 

мой контроллер Класс

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.hateoas.Link; 
import org.springframework.http.HttpStatus; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.*; 
import java.util.HashSet; 
import java.util.Iterator; 
import java.util.Set; 
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; 
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; 
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; 

@Controller 
@RequestMapping("/users") 
public class RESTController { 
Userlist obj2; //userlist is just a class with list of users. this too extends ResourceSupport. 
boolean flag=false; 
private Logger logger = LoggerFactory.getLogger(getClass()); 

@RequestMapping(value = "/{id}",method = RequestMethod.GET) 
@ResponseBody 
public User getUser(@PathVariable int id, @RequestHeader("Accept") String acceptHeader) { 
    User temp = new User(); 
    if(obj2==null) 
    { 
     temp= new User(0, "Null"); 
    } 
    else { 
     Set<User> set1= obj2.getUsers(); 
     for(User a:set1) 
     { 
      if(id==a.getUserId()) temp=a; 
     } 
     } 
//temp.add(new Link("http://localhost:7001/spring-examples-json-xml-ws/users/"+id)); This is working perfectly fine. 
//temp.add(linkTo(methodOn(RESTController.class).getUser(id,acceptHeader)).withSelfRel());This gives **error 1** 

//temp.add(linkTo(RESTController.class).slash(temp.getUserId()).withSelfRel()); This gave **error 2** 

return temp; 
} 

Ошибка 1 ниже

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.113 sec <<< FAILURE! 
returnedUserShouldHaveCorrectId(se.sawano.spring.examples.jsonxmlws.RESTControllerTest) Time elapsed: 0.02 sec <<< ERROR! 
java.lang.NoClassDefFoundError: org/springframework/cglib/proxy/MethodInterceptor 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
at org.springframework.hateoas.core.DummyInvocationUtils.methodOn(DummyInvocationUtils.java:143) 
at org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn(ControllerLinkBuilder.java:129) 
at se.sawano.spring.examples.jsonxmlws.RESTController.getUser(RESTController.java:47) 
at se.sawano.spring.examples.jsonxmlws.RESTControllerTest.returnedUserShouldHaveCorrectId(RESTControllerTest.java:25) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35) 
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115) 
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103) 
at $Proxy0.invoke(Unknown Source) 
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150) 
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91) 
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69) 
Caused by: java.lang.ClassNotFoundException: org.springframework.cglib.proxy.MethodInterceptor 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
... 46 more 

Ошибка 2 ниже

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.11 sec <<< FAILURE! 
returnedUserShouldHaveCorrectId(se.sawano.spring.examples.jsonxmlws.RESTControllerTest) Time elapsed: 0.019 sec <<< ERROR! 
java.lang.IllegalStateException: Could not find current request via RequestContextHolder 
at org.springframework.util.Assert.state(Assert.java:384) 
at org.springframework.hateoas.mvc.ControllerLinkBuilder.getCurrentRequest(ControllerLinkBuilder.java:201) 
at org.springframework.hateoas.mvc.ControllerLinkBuilder.getBuilder(ControllerLinkBuilder.java:167) 
at org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo(ControllerLinkBuilder.java:80) 
at org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo(ControllerLinkBuilder.java:64) 
at se.sawano.spring.examples.jsonxmlws.RESTController.getUser(RESTController.java:47) 
at se.sawano.spring.examples.jsonxmlws.RESTControllerTest.returnedUserShouldHaveCorrectId(RESTControllerTest.java:25) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35) 
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115) 
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103) 
at $Proxy0.invoke(Unknown Source) 
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150) 
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91) 
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69) 

Как мы можем видеть, когда я добавляю строчную ссылку, она работает, но когда я пытаюсь получить, я получаю сообщение об ошибке. Может кто-нибудь, пожалуйста, скажите мне, что я сделал неправильно? Спасибо за ваше время.

ответ

0

У полученного пользователя неправильный идентификатор.

Возможный сценарий: Если параметр id не найден в UserList obj2, пустой экземпляр User используется, и это id равно нулю.

+0

Проведите некоторую отладку, чтобы узнать, какие значения используются в операторе 'temp.add()' – klimpond

+0

Если пользователь не найден в вашем 'UserList', 404 должен быть возвращен. – klimpond

Смежные вопросы