我正在使用InfoQ的Grails教程,名为Grails入门,第二版,我正在尝试将自定义编解码器添加到单元测试中.我的环境是Grails 1.3.7和Groovy 1.7.8.
所以编解码器是SHACodec.groovy,它存在于grails-app/utils中.内容如下:
import java.security.MessageDigest
class SHACodec{
static encode = {target->
MessageDigest md = MessageDigest.getInstance('SHA')
md.update(target.getBytes('UTF-8'))
return new String(md.digest()).encodeAsBase64()
}
}
Run Code Online (Sandbox Code Playgroud)
当我登录应用程序时,编解码器工作得很好.它被用于我的UserController.authenticate()中的密码字段
def authenticate = {
def user =
User.findByLoginAndPassword(params.login, params.password.encodeAsSHA())
if(user){
session.user = user
flash.message = "Hello ${user.login}!"
redirect(controller:"race", action:"list")
}else{
flash.message = "Sorry, ${params.login}. Please try again."
redirect(action:"login")
}
}
Run Code Online (Sandbox Code Playgroud)
当我将其添加到单元测试时,会显示以下错误:
没有这样的属性:类的SHACodec:racetrack.UserControllerTests groovy.lang.MissingPropertyException:没有这样的属性:类的SHACodec:racetrack的Runtrack.UserControllerTests.UserControllerTests.testAuthenticate(UserControllerTests.groovy:39)
测试是:
package racetrack
import org.codehaus.groovy.grails.plugins.codecs.*
import grails.test.*
class UserControllerTests extends ControllerUnitTestCase {
protected void setUp() {
super.setUp()
String.metaClass.encodeAsSHA = {->
SHACodec.encode(delegate)
}
}
protected …Run Code Online (Sandbox Code Playgroud) 我正在使用JAXB / Moxy将类编组为XML。当根元素仅包含属性时,输出如下:
<?xml version="1.0" encoding="UTF-8"?>
<procedure xmlns="http://xml.test.com/api/request" name="TestProcedure"/>
Run Code Online (Sandbox Code Playgroud)
所需的输出包含过程的结束标记:
<?xml version="1.0" encoding="UTF-8"?>
<procedure xmlns="http://xml.test.com/api/request" name="TestProcedure"></procedure>
Run Code Online (Sandbox Code Playgroud)
这将被发送到第三方系统。即使两者都是格式正确的XML,它仍然需要结束标记。
我看到了这篇文章:JAXB在XML上将XML与OutputStream和StringWriter不同, 但是在本地运行时,在输出流和字符串之间没有看到输出差异。
这似乎只处理元素和属性,而不处理根元素: 在xml jaxb中将空值表示为空元素 我仍然设置了DescriptorCustomizer并在调试器中浏览了ClassDescriptor,但是没有看到像XMLDirectMapping。
我的域对象看起来像
@XmlRootElement(name = "procedure")
public class ProcRequest {
protected String procName;
protected String requestId;
protected List<Param> parameter;
@XmlAttribute
public String getProcName() {
return procName;
}
public void setProcName(String procName) {
this.procName = procName;
}
@XmlAttribute
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
@XmlElement
public List<Param> getParam() { …Run Code Online (Sandbox Code Playgroud)