这是我第一次使用springboot和gradle制作一个连接到db的discord机器人。我遵循了一些教程,discord bot运行正常,但是当我想调用db时,它在java中返回null。我尝试在phpmyadmin中使用相同的查询来查看它是否真的为null,但实际上,它应该返回一个值。
这是我的主课
@SpringBootApplication
public class Main {
private static Logger logger = LogManager.getLogger(Main.class);
/**
* The entrance point of our program.
*
* @param args The arguments for the program. The first element should be the bot's token.
*/
public static void main(String[] args) {
// if (args.length < 1) {
// System.err.println("Please provide a valid token as the first argument!");
// return;
// }
SpringApplication.run(Main.class, args);
// Enable debugging, if no slf4j logger was found
FallbackLoggerConfiguration.setDebug(true);
// The token is the first argument of the program
String token = "Nzg3NTI4MTU0MDM3MjIzNDU2.X9WQvw.Ix9zeiZB5KWwGkxfUAU0pjy4xF0";
// We login blocking, just because it is simpler and doesn't matter here
DiscordApi api = new DiscordApiBuilder().setToken(token).login().join();
// Print the invite url of the bot
logger.info("You can invite me by using the following url: " + api.createBotInvite());
// Add listeners
api.addMessageCreateListener(new CommandManager("!")); // <-- I want to run this command
// Log a message, if the bot joined or left a server
api.addServerJoinListener(event -> logger.info("Joined server " + event.getServer().getName()));
api.addServerLeaveListener(event -> logger.info("Left server " + event.getServer().getName()));
}
}
从那里,它将引导我在命令目录中找到commandmanager.java
public class CommandManager implements MessageCreateListener {
String prefix="!";
DieCommand dieCommand = new DieCommand();
EightBallCommand eightBallCommand = new EightBallCommand();
UserInfoCommand userInfoCommand = new UserInfoCommand();
NijiMemberCommand nijiMemberCommand = new NijiMemberCommand();
CurrencyConverterCommand currencyConverterCommand = new CurrencyConverterCommand();
public CommandManager(String pfx) {
this.prefix = pfx;
}
@Override
public void onMessageCreate(MessageCreateEvent event) throws NullPointerException {
String[] command = event.getMessageContent().split(" ");
if(command[0].contains(prefix+"roll")){
dieCommand.onMessageCreate(event);
return;
}
if(command[0].contains(prefix+"8ball")){
eightBallCommand.onMessageCreate(event);
return;
}
if(command[0].contains(prefix+"userinfo")){
userInfoCommand.onMessageCreate(event);
return;
}
if(command[0].contains(prefix+"whois")){
nijiMemberCommand.onMessageCreate(event);
return;
}
if(command[0].contains(prefix+"convert")){
currencyConverterCommand.onMessageCreate(event);
return;
}
}
}
对于这个类,我有一个配置管理器
@Configuration
public class ConfigurationManager {
@Bean
public CommandManager commandManager() {
return new CommandManager("!");
}
}
我要测试的命令是!谁是noraneko,它将引导我访问nijimembercommand.java
@Component
public class NijiMemberCommand implements MessageCreateListener {
@Autowired
MemberListService memberListService;
private static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Main.class);
@Override
public void onMessageCreate(MessageCreateEvent event){
String[] command = event.getMessageContent().split(" ");
if (command.length == 1) {
logger.info("Will it enter here? no?");
event.getChannel().sendMessage("You are missing argument, the command is consist of !member <name of liver>");
return;
}
event.getChannel().sendMessage(memberListService.visual(command[1]));
logger.info("Please enter here..... " + command[1] + " " + memberListService.visual(command[1]));
event.getChannel().sendMessage(memberListService.visual(command[1]));
return;
}
}
直到这一点,没有什么错,直到它达到了 event.getChannel().sendMessage(memberListService.visual(command[1]));
在我看来,它应该引导我到我的服务层
@Service
public class MemberListServiceImpl implements MemberListService {
@Autowired
MemberListDB memberListDB;
private static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Main.class);
public String capitalize(String name){
return name.substring(0, 1).toUpperCase() + name.substring(1);
}
@Override
@Transactional
public String visual(String nama) {
logger.info("Masuk "+ nama);
String[] name = nama.split(" ");
String result =null;
for(String e : name){
result+=capitalize(e)+" ";
}
return memberListDB.showVisual(result);
}
}
这是我的数据库
@Repository
@EnableJpaRepositories
public interface MemberListDB extends JpaRepository<MemberListModel, Long> {
@Query(value = "select m.visual FROM member_list as m, nickname AS n WHERE n.nick_id = m.nick AND n.nickname=:w", nativeQuery = true)
String showVisual(@Param("w") String nama);
}
我尝试在phpmyadmin中运行类似的查询,它显示非空值
我哪里出错了?
//编辑
这是我的模式,我用我的程序
package com.nijicord.nijiworld.db.Model;
import com.nijicord.nijiworld.db.Repository.MemberListDB;
import com.sun.istack.NotNull;
import javax.persistence.*;
import java.io.Serializable;
/**
* This is the table model that will hold the majority of member's info
*/
@Entity
@Table(name = "member_list")
public class MemberListModel implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "nick")
private Long nick_id;
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "social_media")
private Long social_id;
@NotNull
@Column(name = "name")
private String name;
@NotNull
@Column(name = "branch")
private String branch;
@NotNull
@Column(name = "debut_3d")
private boolean debut;
@Column(name = "illustrator")
private String illustrator;
@NotNull
@Column(name = "visual")
private String visual;
public Long getNick_id() {
return nick_id;
}
public void setNick_id(Long nick_id) {
this.nick_id = nick_id;
}
public Long getSocial_id() {
return social_id;
}
public void setSocial_id(Long social_id) {
this.social_id = social_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBranch() {
return branch;
}
public void setBranch(String branch) {
this.branch = branch;
}
public boolean isDebut() {
return debut;
}
public void setDebut(boolean debut) {
this.debut = debut;
}
public String getIllustrator() {
return illustrator;
}
public void setIllustrator(String illustrator) {
this.illustrator = illustrator;
}
public String getVisual() {
return visual;
}
public void setVisual(String visual) {
this.visual = visual;
}
}
////编辑这是错误
2020-12-20 15:37:54.405 ERROR 11840 --- [utorService - 1] o.j.core.util.event.EventDispatcherBase : Unhandled exception in a listener thread for FFJ THREAD EMPORIUM!
java.lang.NullPointerException: null
at com.nijicord.nijiworld.command.NijiMemberCommand.onMessageCreate(NijiMemberCommand.java:27) ~[main/:na]
at com.nijicord.nijiworld.command.CommandManager.onMessageCreate(CommandManager.java:44) ~[main/:an]
//////编辑我已经用流程和代码编辑了我的原始帖子。
1条答案
按热度按时间igetnqfo1#
您正在使用
nama.toUpperCase()
在这里。但在查询中,您使用的昵称是小写的。
noraneko
. 我想这可能是个问题。你用的是大写而不是小写。