我是来自C#背景的Go的新手,我对如何构建Go应用程序感到很困惑.
假设我正在构建一个将位于数据库之上的REST API.还要说,即使在完成之后,由于业务的变迁等原因,这个应用程序可能需要经常更改.
在使用Entity Framework和DTO等工具的C#中,我通过从控制器给出的结果中抽象数据库来稍微缓解这个问题.如果我更改数据库中一堆字段的名称,我可能不得不更改我的数据库访问逻辑,但希望我使用AutoMapper映射到我的实体的DTO可以保持不变,所以我不会破坏依赖于它的前端功能给定的DTO结构.
我应该用Go的结构复制这个结构吗?关于这种方法的一些看起来似乎是错误的,因为结构基本上只是DTO,而且我将有相当多的DTO结构与实体结构相同.我还必须设置逻辑以将实体映射到DTO.这一切都只是在某种程度上感觉非常单一,我在网上看到的许多例子都是序列化数据库结构.
简而言之,人们如何避免他们的API与Go中的数据库之间的过度耦合?他们如何广泛地分离出应用程序的不同部分?
如果它有任何区别,我打算用来sqlx将数据库结果编组到结构体中,如果我不从DTO中分离实体,那么除了JSON之外,这将意味着更多标签.
我正在使用优秀的goa包在 Go 中生成我的 API。
但是,我的安全中间件存在问题,当我向控制器提交不记名令牌时,由于“scopes:null”,我收到“授权失败”。我使用 Auth0 进行身份验证,它正在生成不记名令牌。Postman 中的确切错误是:
{"id":"xOUR882s","code":"jwt_security_error","status":401,"detail":"authorization failed: required 'scopes' not present in JWT claim","meta":{"required":["read:meta"],"scopes":null}}
Run Code Online (Sandbox Code Playgroud)
但是,我的令牌确实包含所需的范围read:meta。jwt.io返回以下解码后的承载:
{
"iss": "https://learnlogic.au.auth0.com/",
"sub": "exJMkK7hXX56lrLwoTqna3s0jh7Gq67e@clients",
"aud": "https://api.learn-logic.com",
"exp": 1494855336,
"iat": 1494768936,
"scopes": "read:meta"
}
Run Code Online (Sandbox Code Playgroud)
middleware/jwt.go我希望有人可以帮助我解决原因,因为我真的不明白该项目中发生了什么goa,可以在这里找到。我唯一的想法是 Auth0 格式的承载的某些内容与parseClaimScopes中的功能不兼容middleware/jwt.go,但我不知道是什么。
我有以下main.go代码:
b, err := ioutil.ReadFile("util/jwt.key")
if err != nil {
return
}
block, _ := pem.Decode([]byte(b))
var cert *x509.Certificate
cert, _ = x509.ParseCertificate(block.Bytes)
rsaPublicKey := cert.PublicKey.(*rsa.PublicKey)
fmt.Println(rsaPublicKey.N)
fmt.Println(rsaPublicKey.E) …Run Code Online (Sandbox Code Playgroud) 我java.lang.NoClassDefFoundError: org/apache/commons/collections/Transformer尝试BeanMap从Apache Commons BeanUtils库使用时收到以下错误.
它由以下代码生成:BeanMap studentBeanMap = new BeanMap(cohortStudentData.get(row));其中cohortStudentData是bean列表.
我使用BeanListHandlerApache DBUtils从数据库中形成bean列表.
我从了解这个和这个错误报告BeanMap依赖于Apache的集合框架.但是,我已将所有相关库导入到我的项目和我的课程中,如下所示:


有谁知道为什么会发生这种情况?
我无法为超过特定点的实体框架中的代码优先迁移而编译我的项目。我正在从xml中读取值以填充表。我有以下代码:
//EnrolmentProgramStartDate
var programQuery = from r in context.EnrolmentPrograms
select r;
var programList = programQuery.ToList<Entities.MetaData.Enrolment.EnrolmentProgram>();
resourceName = "LearnLogicElicos_WebApi.SeedData.MetaData.Enrolment.enrolment_program_start_date.xml";
stream = assembly.GetManifestResourceStream(resourceName);
xml = XDocument.Load(stream);
List<Entities.MetaData.Enrolment.EnrolmentProgramStartDate> enrolmentStartdates = new List<Entities.MetaData.Enrolment.EnrolmentProgramStartDate>();
foreach (var e in xml.Root.Elements("StartDate"))
{
DateTime.TryParse((string)e.Element("Start"), out var startDate);
enrolmentStartdates.Add(new Entities.MetaData.Enrolment.EnrolmentProgramStartDate()
{
PrgmCode = (string)e.Element("ProgramCode"),
StartDate = startDate
});
}
var programStartdateWithFk = (from t1 in enrolmentStartdates
join t2 in programList
on t1.PrgmCode equals t2.PrgmCode
select new Entities.MetaData.Enrolment.EnrolmentProgramStartDate
{
PrgmCode = t1.PrgmCode,
StartDate = t1.StartDate,
EnrolmentProgramFk = t2.PrgmPk
});
context.EnrolmentProgramStartDates.AddRange(programStartdateWithFk); …Run Code Online (Sandbox Code Playgroud) 我在控制器类中有以下代码,用于为组合框提供事件侦听器的 JavaFX GUI:
courseComboBox.getSelectionModel().selectedItemProperty()
.addListener(new ChangeListener<String>() {
@Override
public void changed(
ObservableValue<? extends String> selected,
String oldValue, String newValue) {
// Do stuff
}
});
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试从其中调用另一个方法时,我无法:
courseComboBox.getSelectionModel().selectedItemProperty()
.addListener(new ChangeListener<String>() {
@Override
public void changed(
ObservableValue<? extends String> selected,
String oldValue, String newValue) {
this.setClassList(courseProcessed);
// Do Stuff
}
});
Run Code Online (Sandbox Code Playgroud)
不过,我可以在班级的其他地方调用该方法。更具体地说,我可以initialize()在该侦听器所在的控制器中的函数中调用它。为什么我会遇到这个问题?