官方Grails文档说明了这一点
脚手架插件的2.0.x版包含不同的脚手架模板,这些模板与Grails 2.3及更高版本中的新REST API一致.(摘自http://grails.org/doc/latest/guide/scaffolding.html)
但我无法制作(或者我不理解这个概念)与脚手架一起工作RESTfulness.
让我们从头开始:
grails create-app myapp
cd myapp/
grails create-domain-class Book
grails create-scaffold-controller myapp.Book
Run Code Online (Sandbox Code Playgroud)
将字段添加到域类
class Book {
String text
static constraints = {
}
}
Run Code Online (Sandbox Code Playgroud)
然后运行应用程序grails run-app
.在http://localhost:8080/myapp/
脚手架上运行很棒的节目上冲浪:
http://localhost:8080/myapp/book/index
页面显示书籍列表http://localhost:8080/myapp/book/show/1
页面显示id为1的图书的详细信息http://localhost:8080/myapp/book/create
页面创建一本书我们来看看REST的情况.官方文档称我应该使用类似于http://localhost:8080/myapp/books/...
REST的URL ,但是任何尝试访问应用程序的方式都是如此,这样就会curl -i -H "Accept: application/json" localhost:8080/myapp/books/1
返回带有大量HTML的404.
好的,让我们仔细阅读文档:
在Grails中创建RESTful API的最简单方法是将域类公开为REST资源.这可以通过将grails.rest.Resource转换添加到任何域类来完成
没问题,现在Book类标题是
import grails.rest.*
@Resource(uri='/books') class Book {
Run Code Online (Sandbox Code Playgroud)
现在冲上http://localhost:8080/myapp/
脚手架被打破的节目:
http://localhost:8080/myapp/book/index
页面显示书籍列表http://localhost:8080/myapp/book/create
页面显示xml输出 <?xml version="1.0" encoding="UTF-8"?><book><text /></book>
我在URLMappings.groovy 中使用@Resource …
我有一些处理HTTP请求的代码,我想对它进行单元测试.
因此,我正在尝试模拟dispatch.Http甚至更好的dispatch.HttpExecutor(0.8.5)与Scala(2.9.1.final),Mockito(1.9.0-rc1)和ScalaTest(1.6.1),但即使可以'让我的测试代码可编辑.
在MyHttpTest中,我希望收到任何HTTP请求的某些HTTP响应:
import org.scalatest.FunSuite
import org.scalatest.mock.MockitoSugar
import org.mockito.Mockito.when
import org.mockito.Matchers.any
import dispatch._
class MyHttpTest extends FunSuite with MockitoSugar {
test("example") {
val httpMock = mock[HttpExecutor]
when(httpMock.apply(any(classOf[Handler[String]]))).thenReturn("Some_HTTP_response")
}
}
Run Code Online (Sandbox Code Playgroud)
但它会产生编译错误:
error: overloaded method value thenReturn with alternatives:
(httpMock.HttpPackage[String],<repeated...>[httpMock.HttpPackage[String]])org.mockito.stubbing.OngoingStubbing[httpMock.HttpPackage[String]] <and>
(httpMock.HttpPackage[String])org.mockito.stubbing.OngoingStubbing[httpMock.HttpPackage[String]]
cannot be applied to (java.lang.String)
when(httpMock.apply(any(classOf[Handler[String]]))).thenReturn("Some_response")
Run Code Online (Sandbox Code Playgroud)
那么如何模拟调度客户端呢?
我构建了一个简单的应用程序,它在服务器端使用Spring Data 3.1.0.RELEASE和Eclipselink 2.4 - 它托管在Tomcat 7.0.27中.在mywebapp/META-INF/context.xml中,我有Spring类加载器
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
Run Code Online (Sandbox Code Playgroud)
如果我把spring-instrument-tomcat.jar
成$TOMCAT_HOME/lib
则在Tomcat运行mywebapp很好,但如果我把spring-instrument-tomcat.jar
进$TOMCAT_HOME/webapps/mywebapp/WEB-INF/lib
- Tomcat的,出现异常死亡
java.lang.IllegalStateException: ClassLoader [org.apache.catalina.loader.WebappClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar
Run Code Online (Sandbox Code Playgroud)
Context loader参数useSystemClassLoaderAsParent
设置false
也没有帮助.
我不想在Tomcat中拥有任何(自定义)全局库(在现实生产系统中使用全局库并不容易)因此我试图将所有需要的东西本地化(简单)但是很大的战争档案.有关如何实现这种封装的任何想法?
tomcat classloader context.xml load-time-weaving spring-data
我有自定义初始值设定项,它扩展AbstractSecurityWebApplicationInitializer
. 它在过滤器链的开头添加了几个过滤器。
@Order(2)
public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
@Override
protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding(StandardCharsets.UTF_8.name());
characterEncodingFilter.setForceEncoding(true);
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
insertFilters(servletContext, characterEncodingFilter, hiddenHttpMethodFilter);
}
}
Run Code Online (Sandbox Code Playgroud)
在生产中,它按预期工作。但是我不能让它在集成测试环境中启动(或者更好地说:让 Spring 加载它)。这是测试的片段:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {ApplicationConfiguration.class, FakeInMemoryMongoConfiguration.class, WebConfiguration.class})
@ActiveProfiles("test")
public class CarPartControllerIntegrationTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
mockMvc = webAppContextSetup(wac).build();
}
...
}
Run Code Online (Sandbox Code Playgroud)
即,SecurityApplicationInitializer.beforeSpringSecurityFilterChain()
在测试期间不调用。现在我决定在测试的过滤器链中手动添加过滤器。但我认为应该有更好的解决方案。
请帮助让世界变得更好:)谢谢!
classloader ×1
context.xml ×1
grails ×1
java ×1
mocking ×1
mockito ×1
rest ×1
scaffolding ×1
scala ×1
spring ×1
spring-data ×1
spring-test ×1
tomcat ×1
unit-testing ×1