小编aka*_*_sh的帖子

如何在Grails 2.3中一起使用scaffolding和RESTfulness

官方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>
  • 所以强制,坏的新xml输出.

我在URLMappings.groovy 中使用@Resource …

rest grails scaffolding

11
推荐指数
1
解决办法
7664
查看次数

如何在Scala测试中模拟Dispatch http客户端?

我有一些处理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)

那么如何模拟调度客户端呢?

unit-testing scala mocking mockito scala-dispatch

5
推荐指数
1
解决办法
5917
查看次数

如何使Tomcat与META-INF/context.xml中定义的TomcatInstrumentableClassLoader一起使用WEB-INF/lib/spring-instrument-tomcat.jar

我构建了一个简单的应用程序,它在服务器端使用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

5
推荐指数
1
解决办法
2万
查看次数

Spring AbstractSecurityWebApplicationInitializer 未在集成测试中启动

我有自定义初始值设定项,它扩展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()在测试期间不调用。现在我决定在测试的过滤器链中手动添加过滤器。但我认为应该有更好的解决方案。

请帮助让世界变得更好:)谢谢!

java spring integration-testing spring-security spring-test

3
推荐指数
1
解决办法
1002
查看次数