我不断收到“无法为不可为空的字段Airline.id返回null”。当FlightSchedule.operatingAirline为null(根据架构完全有效)并且客户端查询FlightSchedule.operatingAirline.id时发生错误。如何解决这个问题?将Airline.id,Airline.code和Airline.name设置为可为空可解决此问题,但这不是解决此问题的正确方法,因为如果存在Airline,这3个字段也将始终存在。以下是我的架构:
type Airline {
id: String!,
code: String!,
name: String!
}
type FlightSchedule {
airline: Airline!
operatingAirline: Airline
}
以下是我的查询:
getFlightSchedules {
airline
{
id
code
name
}
operatingAirline
{
id
code
name
}
}
答案 0 :(得分:3)
在解决错误时,该字段将解析为null。其中包括您遇到的验证错误。根据规格:
如果在ExecuteSelectionSet()期间,具有非null fieldType的字段引发字段错误,那么该错误必须传播到整个选择集,如果允许则解析为null或进一步传播到父字段。
如果发生这种情况,则可以取消所有尚未执行或尚未产生值的同级字段,以避免不必要的工作。
换句话说,如果父字段具有特定的对象类型,则并且该类型具有不可为空的字段,并且将该字段解析为null,即父字段也将解析为null。父字段不能返回无效的对象(在这种情况下,因为它有一个非null字段返回null),所以它唯一可以做的就是返回null。当然,如果父字段本身非空,则此行为会沿树传播,直到最终遇到可为空的字段为止。
那么,为什么会出现该错误?因为您的@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = SecurityTestConfig.class)
@AutoConfigureMockMvc
@ActiveProfiles({"test", "test-security-profile"})
@TestInstance(Lifecycle.PER_CLASS)
@Nested
@DisplayName("Inner test")
class InnerTest {
@Test
@Sql("/permission.sql")
void temp() {//here @Sql throws exception}
}
的解析器不返回空值。它返回某种对象(不完整的航空公司对象,数组,字符串或其他东西),然后GraphQL有效地尝试将其强制转换为operatingAirline
类型。请求了id字段,但是它根据Airline
的解析器返回的对象解析为null。由于请求了operatingAirline
并返回了null,因此整个id
字段均未通过验证并返回null。